@sbb-esta/lyne-elements-experimental-dev 5.0.0-next.2-dev.1778141166 → 5.0.0-next.2-dev.1778145569
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/custom-elements.json +84 -84
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
- package/development/autocomplete-grid-cell.component-BF8i4388.js +1 -1
- package/development/autocomplete-grid-option.component-D9pTXPlu.js +1 -1
- package/development/autocomplete-grid-row.component-CBHh50jC.js +1 -1
- package/development/core/timetable/access-leg-helper.js +1 -1
- package/development/core/timetable/timetable-helper.js +1 -1
- package/development/date-helper-DGz-ztQM.js +1 -1
- package/development/differenceInMinutes-B7_GTDq7.js +1 -1
- package/development/format-DFx4997p.js +1 -1
- package/development/isValid-JpZ7FphI.js +1 -1
- package/development/journey-summary.component-De1ioDRq.js +1 -1
- package/development/mapper-hWWm7Uke.js +1 -1
- package/development/pearl-chain-time.component-BxVQ1z-Z.js +1 -1
- package/development/pearl-chain-vertical-item.component-DJioJtxP.js +1 -1
- package/development/pearl-chain-vertical.component-zSOeIkhh.js +1 -1
- package/development/pearl-chain.component-B83OsEx8.js +1 -1
- package/development/seat-reservation/common/translations/i18n.js +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1 -1
- package/development/seat-reservation-area.component-CMqjbUtV.js +1 -1
- package/development/seat-reservation-graphic.component-C2r57590.js +1 -1
- package/development/seat-reservation-navigation-coach.component-BwLbiHCG.js +1 -1
- package/development/seat-reservation-navigation-services.component-Do8JLJh3.js +1 -1
- package/development/seat-reservation-place-control.component-BfuOGZYq.js +1 -1
- package/development/seat-reservation-scoped.component-D-Mvw-Q3.js +1 -1
- package/development/seat-reservation.component-B-n0sIL5.js +1 -1
- package/development/timetable-duration.component-fBla8Kue.js +1 -1
- package/development/timetable-row.component-C9Y9Rev1.js +1 -1
- package/development/toDate-DOFAOjP-.js +1 -1
- package/package.json +2 -2
|
@@ -1456,4 +1456,4 @@ var SeatReservationBaseElement = (() => {
|
|
|
1456
1456
|
//#endregion
|
|
1457
1457
|
export { SeatReservationBaseElement };
|
|
1458
1458
|
|
|
1459
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGlzTG9jb21vdGl2ZTogdGhpcy5faXNMb2NvbW90aXZlKGNvYWNoKSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI1RJTU8tNDU4NThcbiAgLy8gRmluZHMgdGhlIG9wdGltYWwgaWNvbiBzaXplIGJhc2VkIG9uIGFsbCBzZXJ2aWNlRWxlbWVudHMgYW5kIHRoZWlyIGRpbWVuc2lvbi5cbiAgLy8gVGhpcyBzZXRzIHRoZSBnbG9iYWxBcmVhSWNvbkRpbSBhbmQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgZWxlbWVudHMuXG4gIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtYXhpbXVtIHVuaWZvcm0gaWNvbiBzaXplIHdpdGhpbiB0aGUgYXJlYSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFsbFNlcnZpY2VEaW1lbnNpb25zOiBFbGVtZW50RGltZW5zaW9uW10gPSBbXTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChkZWNrKSA9PlxuICAgICAgICBkZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgoY29hY2gpID0+XG4gICAgICAgICAgY29hY2guc2VydmljZUVsZW1lbnRzPy5mb3JFYWNoKChpY29uKSA9PiBhbGxTZXJ2aWNlRGltZW5zaW9ucy5wdXNoKGljb24uZGltZW5zaW9uKSksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBpZiAoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIGFsbFNlcnZpY2VEaW1lbnNpb25zLnNvcnQoXG4gICAgICAgICAgKGRpbTE6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQsIGRpbTI6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChkaW0xICYmIGRpbTIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMSA9IGRpbTEudyArIGRpbTEuaDtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMiA9IGRpbTIudyArIGRpbTIuaDtcbiAgICAgICAgICAgICAgaWYgKG1heERpbTEgPiBtYXhEaW0yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4RGltMSA8IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYmVzdCBpY29uIHNpemUgYnkgbWVkaWFuXG4gICAgICAgIGNvbnN0IG1lZGlhbkljb25TaXplID0gYWxsU2VydmljZURpbWVuc2lvbnNbTWF0aC5mbG9vcihhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGggLyAyKV0hO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZGV0ZXJtaW5lZCBtZWRpYW4gaWNvbiBzaXplIGFzIGdsb2JhbCBjYWxjdWxhdGVkIGFyZWEgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihtZWRpYW5JY29uU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIHRoZSBtYXhpbXVtIGNvYWNoIGhlaWdodCBmcm9tIGFsbCBkZWNrc1xuICAgICAgICBjb25zdCBtYXhDb2FjaEhlaWdodCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5mbGF0TWFwKChkZWNrKSA9PiBkZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4gY29hY2guZGltZW5zaW9uLmgpKVxuICAgICAgICAgIC5yZWR1Y2UoKG1heCwgaGVpZ2h0KSA9PiBNYXRoLm1heChtYXgsIGhlaWdodCksIDApO1xuXG4gICAgICAgIC8vY2FsY3VsYXRlIDIwJSBvZiBtYXhpbXVtIGhlaWdodCBhcyBpY29uIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBpY29uRGltZW5zaW9uID0gTWF0aC5mbG9vcihtYXhDb2FjaEhlaWdodCAqIDAuMik7XG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oe1xuICAgICAgICAgIHc6IGljb25EaW1lbnNpb24sXG4gICAgICAgICAgaDogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdGSVJTVCc7XG4gICAgfVxuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdTRUNPTkQnO1xuICAgIH1cbiAgICByZXR1cm4gJ0FOWV9DTEFTUyc7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29hY2hEcml2ZXJBcmVhcyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgIChncmFwaGljYWxFbGVtZW50cykgPT4gZ3JhcGhpY2FsRWxlbWVudHMuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICApO1xuXG4gICAgaWYgKGNvYWNoRHJpdmVyQXJlYXMgJiYgY29hY2hEcml2ZXJBcmVhcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgZHJpdmVyIGFyZWEgcG9zaXRpb24gd2hldGhlciBpdCBpcyBwcmVzZW50IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgaW4gYSBjb2FjaFxuICAgICAgY29uc3QgaGFzTGVmdERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB8fCBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1JpZ2h0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPiAwKSB8fCBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogISFoYXNMZWZ0RHJpdmVyQXJlYSxcbiAgICAgICAgcmlnaHQ6ICEhaGFzUmlnaHREcml2ZXJBcmVhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uID0gKHByb3BlcnR5SWRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAoIXByb3BlcnR5SWRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2hydW5rUHJvcGVydHlJZHMgPSBwcm9wZXJ0eUlkc1xuICAgICAgPy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5SWQ6IHN0cmluZyk6IHtcbiAgICAgICAgcElkOiBzdHJpbmc7XG4gICAgICAgIHN2Z05hbWU6IHN0cmluZztcbiAgICAgIH0ge1xuICAgICAgICAvLyBwcmVwYXJlIHRlbXBvcmFyeSBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBpZCB0byBpdCdzIHN2Z05hbWUgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIGljb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcElkOiBwcm9wZXJ0eUlkLFxuICAgICAgICAgIHN2Z05hbWU6IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA/IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC8vZmlsdGVyIG91dCBvYmplY3RzIHNlcnZpY2UgaWNvbnMgd2hpY2ggYXJlIG5vdCBpbiBBTExPV0VEX1NFUlZJQ0VfSUNPTlNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5VG9TdmcpID0+IEFMTE9XRURfU0VSVklDRV9JQ09OUy5pbmRleE9mKHByb3BlcnR5VG9Tdmcuc3ZnTmFtZSkgIT09IC0xKVxuICAgICAgLy9tYWtlIGl0IGRpc3RpbmN0IGJ5IHN2Z05hbWVcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgc2VsZi5tYXAoKHByb3BTdmcpID0+IHByb3BTdmcuc3ZnTmFtZSkuaW5kZXhPZih2YWx1ZS5zdmdOYW1lKSA9PT0gaW5kZXgsXG4gICAgICApXG4gICAgICAvLyBnbyBiYWNrIHRvIHByb3BlcnR5SWQgc3RyaW5nIGZyb20gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgLm1hcCgocHJvcGVydHlUb1N2ZykgPT4gcHJvcGVydHlUb1N2Zy5wSWQpXG4gICAgICAvLyB0YWtlIGZpcnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZnJvbSBCYWNrZW5kLCBvdGhlcndpc2UgdGhlIGxheW91dCBjb3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgIC5zbGljZSgwLCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTKTtcbiAgICByZXR1cm4gc2hydW5rUHJvcGVydHlJZHMgPyBzaHJ1bmtQcm9wZXJ0eUlkcyA6IFtdO1xuICB9O1xuXG4gIC8vIEluaXRpYWxseSBjYWxjdWxhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBhbGwgY29hY2ggZWxlbWVudHMsIGFyZWEgZWxlbWVudHMsIHNlcnZpY2UgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZUluZm9ybWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgICAgICBkZWNrczogW10sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjazogU2VhdHJlc2VydmF0aW9uRGVjayA9IHtcbiAgICAgICAgICBkZWNrSW5kZXg6IGluZGV4LFxuICAgICAgICAgIGRlY2tDb2FjaGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXM/LmZvckVhY2goKGNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRBcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYWxsRWxlbWVuZXRzID1cbiAgICAgICAgICAgIGZpbHRlcmVkQXJlYUVsZW1lbnRzXG4gICAgICAgICAgICAgID8uY29uY2F0KGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5jb25jYXQoY29hY2hJdGVtLnBsYWNlcyB8fCBbXSkgfHwgW107XG4gICAgICAgICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgICBhbGxFbGVtZW5ldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcihcbiAgICAgICAgICAgICAgKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIHRydWUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvdGhlckVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50c1xuICAgICAgICAgICAgPy5maWx0ZXIoKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIGZhbHNlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc2VydmljZUVsZW1lbnRzID0gY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cz8ubWFwKChlbGUpID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYm9yZGVyTWlkZGxlRWxlbWVudCA9IHRoaXMuX2dldENhbGN1bGF0ZWRNaWRkbGVCb3JkZXJFbGVtZW50KGNvYWNoSXRlbSk7XG4gICAgICAgICAgY29uc3QgY2FsY0NvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHsgLi4uY29hY2hJdGVtLmRpbWVuc2lvbiB9KTtcbiAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHNpbmdsZSBjb2FjaFxuICAgICAgICAgIGNvbnN0IGNvYWNoU3R1cmN0dXJlOiBDb2FjaFN0cnVjdHVyZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBjYWxjQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgICAgIGhlaWdodDogY2FsY0NvYWNoRGltZW5zaW9uLmgsXG4gICAgICAgICAgICBvdGhlckVsZW1lbnRzOiBvdGhlckVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgc2VydmljZUVsZW1lbnRzOiBzZXJ2aWNlRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBhcmVhRWxlbWVudHM6IGFyZWFFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGJvcmRlck1pZGRsZUVsZW1lbnQ6IGJvcmRlck1pZGRsZUVsZW1lbnQsXG4gICAgICAgICAgICBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzOiBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmRlY2tDb2FjaGVzLnB1c2goY29hY2hTdHVyY3R1cmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrcy5wdXNoKHNlYXRSZXNlcnZhdGlvbkRlY2spO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBvZiB0aGUgbWlkZGxlIGJvcmRlci5cbiAgICogVG8gY2FsY3VsYXRlIHRoZSBzdGFydCArIGVuZCBjb29yZGluYXRlIGFuZCB0aGUgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyIGNvYWNoIGdyYXBoaWMsXG4gICAqIHRoZSBleGlzdGluZyBkb2NraW5nIGNvYWNoIGdyYXBoaWNzIGFyZSBhbmFseXNlZCBhbmQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHBvc2l0aW9uIGFuZCBkaWVtZW5zaW9uIGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2g6IENvYWNoSXRlbSk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBib3JkZXJIZWlnaHQgPSAoY29hY2guZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAvLyBEZWZhdWx0IC0gd2l0aG91dCBmaW5kaW5nIGRvY2tpbmcgYm9yZGVyIGVsZW1lbnRzLCB0aGUgbWlkZGxlIGJvcmRlciBnb2VzIGZyb20gMCBwb3NpdGlvbiB1bnRpbCBjb2FjaCB3aWR0aCBlbmRcbiAgICBsZXQgc3RhcnRCb3JkZXJPZmZzZXRYID0gMDtcbiAgICBsZXQgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udztcblxuICAgIGlmIChjb2FjaC5ncmFwaGljRWxlbWVudHMpIHtcbiAgICAgIC8vIERvY2tpbmdFbGVtZW50ZSBkZWZpbmVzIHRoZSBlbGVtZW50cyB3aGVyZSB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCByZWFsbHkgc3RhcnRzIGFuZCBlbmRzXG4gICAgICBjb25zdCBkb2NraW5nRWxlbWVudHMgPSB0aGlzLl9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoY29hY2guZ3JhcGhpY0VsZW1lbnRzKTtcblxuICAgICAgLy8gVHdvIGRvY2tpbmcgY29hY2ggZWxlbWVudHMgZXhpc3QgKG5vcm1hbCBjYXNlIC0gc3RhcnQgYW5kIGVuZCBkb2NraW5nIGVsZW1lbnQpXG4gICAgICBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMikge1xuICAgICAgICBjb25zdCBmaXJzdERvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBsYXN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMV07XG4gICAgICAgIGNvbnN0IGVuZEJvcmRlck9mZnNldFggPVxuICAgICAgICAgIGZpcnN0RG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PSAwXG4gICAgICAgICAgICA/IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuXG4gICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gZmlyc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBsYXN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGVuZEJvcmRlck9mZnNldFggLSBzdGFydEJvcmRlck9mZnNldFg7XG4gICAgICB9XG4gICAgICAvLyBPbmx5IG9uZSBkb2NraW5nIGJvcmRlciBjb2FjaCBlbGVtZW50cyBleGlzdCAoc3RhcnQgb3IgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50cz8ubGVuZ3RoID09IDEpIHtcbiAgICAgICAgY29uc3QgZG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG5cbiAgICAgICAgLy8gTWlkZGxlQm9yZGVyIHN0YXJ0cyBmcm9tIGxlZnQgZG9ja2luZyBlbGVtZW50IHVudGlsIGNvYWNoIGVuZFxuICAgICAgICBpZiAoZG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkge1xuICAgICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9IGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgfVxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gcG9zaXRpb24geCAwIHVudGlsIGRvY2tpbmcgZWxlbWVudCBvbiB0aGUgcmlnaHQgY29hY2ggc2lkZVxuICAgICAgICBlbHNlIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ICE9PSAwKSB7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeU9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nICogLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHsgeDogc3RhcnRCb3JkZXJPZmZzZXRYICogdGhpcy5iYXNlR3JpZFNpemUsIHk6IHlPZmZzZXQsIHo6IDAgfSxcbiAgICAgIGRpbWVuc2lvbjogeyB3OiBib3JkZXJXaWR0aCAqIHRoaXMuYmFzZUdyaWRTaXplLCBoOiBib3JkZXJIZWlnaHQgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ3JhcGhpY2FsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYm9yZGVyIGVsZW1lbnRzIG9mIHRoZSBjb2FjaC5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRbXVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGdyYXBoaWNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IEJhc2VFbGVtZW50W10ge1xuICAgIC8vIEdldCBhbGwgcmVsZXZhbnQgZG9ja2luZyBlbGVtZW50cyBhbmQgc29ydHMgdGhlbSBhZ2FpbiBhY2NvcmRpbmcgdG8gdGhlaXIgeCBwb3NpdGlvbiBjb29yZGluYXRlcyxcbiAgICAvLyB0aHVzIHRoZSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudHMgd291bGQgYmUgZGVmaW5lZFxuICAgIGNvbnN0IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzID0gKFxuICAgICAgZ3JhcGhpY0VsZW1lbnRzLmZpbHRlcigoZWxlKSA9PiB0aGlzLm1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cy5pbmNsdWRlcyhlbGUuaWNvbiEpKSB8fCBbXVxuICAgICkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24ueDtcbiAgICAgIGNvbnN0IHBvc0IgPSBiLnBvc2l0aW9uLng7XG4gICAgICBpZiAocG9zQSA+IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpZiAocG9zQSA8IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWREb2NraW5nRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKF8sIGluZGV4KSA9PiBpbmRleCA9PSAwIHx8IGluZGV4ID09IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmxlbmd0aCAtIDEsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBncmFwaGljYWwsIHNlcnZpY2UgYW5kIGFyZWEgZWxlbWVudHNcbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoXG4gICAgZWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNDYWxjQXJlYUVsZW1lbnQ6IGJvb2xlYW4sXG4gICk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBkaW0gPSB7IC4uLmVsZW1lbnQuZGltZW5zaW9uIH07XG4gICAgY29uc3QgcG9zID0geyAuLi5lbGVtZW50LnBvc2l0aW9uIH07XG4gICAgY29uc3Qgcm90YXRpb24gPSBlbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5jb25jYXQodGhpcy5ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucykuaW5kZXhPZihlbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgY29uc3QgY2FsY1JvdGF0aW9uID1cbiAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID8gcm90YXRpb24gLSA5MCA6IHJvdGF0aW9uO1xuICAgIGxldCBhcmVhTW91bnRpbmc6IEVsZW1lbnRNb3VudGluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIEFyZWFFbGVtZW50c1xuICAgIGlmIChpc0NhbGNBcmVhRWxlbWVudCkge1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBlbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgICB0aGlzLmlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoZWxlbWVudCwgY29hY2hEaW1lbnNpb24pICYmIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuXG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmgpIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ2xvd2VyLWJvcmRlcic7XG4gICAgICAgIGlmICghc3RyZXRjaEhlaWdodCkge1xuICAgICAgICAgIHBvcy55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZXRjaEhlaWdodCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBhbGwgb3RoZXIgZ3JhcGhpY2FsIGVsZW1lbnRzXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2FjaERpbWVuc2lvbi5oID09PSBlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oKSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpbS53ID0gTWF0aC5yb3VuZChkaW0udyAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBkaW0uaCA9IE1hdGgucm91bmQoZGltLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBwb3MueCA9IE1hdGgucm91bmQocG9zLnggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG4gICAgcG9zLnkgPSBNYXRoLnJvdW5kKHBvcy55ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBlbGVtZW50Lmljb24gJiYgZWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZWxlbWVudC5pY29uPy5jb25jYXQoJ18nLCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlKVxuICAgICAgICA6IGVsZW1lbnQuaWNvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBpY29uLFxuICAgICAgcm90YXRpb246IGNhbGNSb3RhdGlvbixcbiAgICAgIGRpbWVuc2lvbjogZGltLFxuICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgIG1vdW50aW5nOiBhcmVhTW91bnRpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pc0xvY29tb3RpdmUoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJdGVtPy5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICApICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQ0EsSUFBSztDQUFMLFNBQUssaUJBQWU7QUFDbEIsaUJBQUEsV0FBQTtBQUNBLGlCQUFBLFVBQUE7R0FGRyxvQkFBQSxrQkFBZSxFQUFBLEVBQUE7QUE4QnBCLElBQU0seUJBQXlCO0FBQy9CLElBQU0sd0JBQWtDO0NBQ3RDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0Q7SUFFWSxvQ0FBMEI7bUJBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQUFuQyxtQ0FBbUMsWUFBVTs7O21DQU92RCxTQUFTO0lBQUUsV0FBVztJQUFxQixNQUFNO0lBQU8sQ0FBQyxDQUFBO2tDQUl6RCxTQUFTO0lBQUUsV0FBVztJQUFvQixNQUFNO0lBQVEsQ0FBQyxDQUFBO2dDQUl6RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBa0IsTUFBTTtJQUFTLENBQUMsQ0FBQTtnQ0FJeEQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxTQUFTO0lBQU0sWUFBWTtJQUFNLENBQUMsQ0FBQTsrQkFJekYsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUSxDQUFDLENBQUE7eUJBSXZELFdB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
|
|
1459
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGlzTG9jb21vdGl2ZTogdGhpcy5faXNMb2NvbW90aXZlKGNvYWNoKSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI1RJTU8tNDU4NThcbiAgLy8gRmluZHMgdGhlIG9wdGltYWwgaWNvbiBzaXplIGJhc2VkIG9uIGFsbCBzZXJ2aWNlRWxlbWVudHMgYW5kIHRoZWlyIGRpbWVuc2lvbi5cbiAgLy8gVGhpcyBzZXRzIHRoZSBnbG9iYWxBcmVhSWNvbkRpbSBhbmQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgZWxlbWVudHMuXG4gIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtYXhpbXVtIHVuaWZvcm0gaWNvbiBzaXplIHdpdGhpbiB0aGUgYXJlYSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFsbFNlcnZpY2VEaW1lbnNpb25zOiBFbGVtZW50RGltZW5zaW9uW10gPSBbXTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChkZWNrKSA9PlxuICAgICAgICBkZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgoY29hY2gpID0+XG4gICAgICAgICAgY29hY2guc2VydmljZUVsZW1lbnRzPy5mb3JFYWNoKChpY29uKSA9PiBhbGxTZXJ2aWNlRGltZW5zaW9ucy5wdXNoKGljb24uZGltZW5zaW9uKSksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBpZiAoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIGFsbFNlcnZpY2VEaW1lbnNpb25zLnNvcnQoXG4gICAgICAgICAgKGRpbTE6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQsIGRpbTI6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChkaW0xICYmIGRpbTIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMSA9IGRpbTEudyArIGRpbTEuaDtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMiA9IGRpbTIudyArIGRpbTIuaDtcbiAgICAgICAgICAgICAgaWYgKG1heERpbTEgPiBtYXhEaW0yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4RGltMSA8IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYmVzdCBpY29uIHNpemUgYnkgbWVkaWFuXG4gICAgICAgIGNvbnN0IG1lZGlhbkljb25TaXplID0gYWxsU2VydmljZURpbWVuc2lvbnNbTWF0aC5mbG9vcihhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGggLyAyKV0hO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZGV0ZXJtaW5lZCBtZWRpYW4gaWNvbiBzaXplIGFzIGdsb2JhbCBjYWxjdWxhdGVkIGFyZWEgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihtZWRpYW5JY29uU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIHRoZSBtYXhpbXVtIGNvYWNoIGhlaWdodCBmcm9tIGFsbCBkZWNrc1xuICAgICAgICBjb25zdCBtYXhDb2FjaEhlaWdodCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5mbGF0TWFwKChkZWNrKSA9PiBkZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4gY29hY2guZGltZW5zaW9uLmgpKVxuICAgICAgICAgIC5yZWR1Y2UoKG1heCwgaGVpZ2h0KSA9PiBNYXRoLm1heChtYXgsIGhlaWdodCksIDApO1xuXG4gICAgICAgIC8vY2FsY3VsYXRlIDIwJSBvZiBtYXhpbXVtIGhlaWdodCBhcyBpY29uIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBpY29uRGltZW5zaW9uID0gTWF0aC5mbG9vcihtYXhDb2FjaEhlaWdodCAqIDAuMik7XG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oe1xuICAgICAgICAgIHc6IGljb25EaW1lbnNpb24sXG4gICAgICAgICAgaDogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdGSVJTVCc7XG4gICAgfVxuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuICdTRUNPTkQnO1xuICAgIH1cbiAgICByZXR1cm4gJ0FOWV9DTEFTUyc7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29hY2hEcml2ZXJBcmVhcyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgIChncmFwaGljYWxFbGVtZW50cykgPT4gZ3JhcGhpY2FsRWxlbWVudHMuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICApO1xuXG4gICAgaWYgKGNvYWNoRHJpdmVyQXJlYXMgJiYgY29hY2hEcml2ZXJBcmVhcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgZHJpdmVyIGFyZWEgcG9zaXRpb24gd2hldGhlciBpdCBpcyBwcmVzZW50IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgaW4gYSBjb2FjaFxuICAgICAgY29uc3QgaGFzTGVmdERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB8fCBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1JpZ2h0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPiAwKSB8fCBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogISFoYXNMZWZ0RHJpdmVyQXJlYSxcbiAgICAgICAgcmlnaHQ6ICEhaGFzUmlnaHREcml2ZXJBcmVhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uID0gKHByb3BlcnR5SWRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAoIXByb3BlcnR5SWRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2hydW5rUHJvcGVydHlJZHMgPSBwcm9wZXJ0eUlkc1xuICAgICAgPy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5SWQ6IHN0cmluZyk6IHtcbiAgICAgICAgcElkOiBzdHJpbmc7XG4gICAgICAgIHN2Z05hbWU6IHN0cmluZztcbiAgICAgIH0ge1xuICAgICAgICAvLyBwcmVwYXJlIHRlbXBvcmFyeSBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBpZCB0byBpdCdzIHN2Z05hbWUgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIGljb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcElkOiBwcm9wZXJ0eUlkLFxuICAgICAgICAgIHN2Z05hbWU6IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA/IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC8vZmlsdGVyIG91dCBvYmplY3RzIHNlcnZpY2UgaWNvbnMgd2hpY2ggYXJlIG5vdCBpbiBBTExPV0VEX1NFUlZJQ0VfSUNPTlNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5VG9TdmcpID0+IEFMTE9XRURfU0VSVklDRV9JQ09OUy5pbmRleE9mKHByb3BlcnR5VG9Tdmcuc3ZnTmFtZSkgIT09IC0xKVxuICAgICAgLy9tYWtlIGl0IGRpc3RpbmN0IGJ5IHN2Z05hbWVcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgc2VsZi5tYXAoKHByb3BTdmcpID0+IHByb3BTdmcuc3ZnTmFtZSkuaW5kZXhPZih2YWx1ZS5zdmdOYW1lKSA9PT0gaW5kZXgsXG4gICAgICApXG4gICAgICAvLyBnbyBiYWNrIHRvIHByb3BlcnR5SWQgc3RyaW5nIGZyb20gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgLm1hcCgocHJvcGVydHlUb1N2ZykgPT4gcHJvcGVydHlUb1N2Zy5wSWQpXG4gICAgICAvLyB0YWtlIGZpcnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZnJvbSBCYWNrZW5kLCBvdGhlcndpc2UgdGhlIGxheW91dCBjb3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgIC5zbGljZSgwLCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTKTtcbiAgICByZXR1cm4gc2hydW5rUHJvcGVydHlJZHMgPyBzaHJ1bmtQcm9wZXJ0eUlkcyA6IFtdO1xuICB9O1xuXG4gIC8vIEluaXRpYWxseSBjYWxjdWxhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBhbGwgY29hY2ggZWxlbWVudHMsIGFyZWEgZWxlbWVudHMsIHNlcnZpY2UgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZUluZm9ybWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgICAgICBkZWNrczogW10sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjazogU2VhdHJlc2VydmF0aW9uRGVjayA9IHtcbiAgICAgICAgICBkZWNrSW5kZXg6IGluZGV4LFxuICAgICAgICAgIGRlY2tDb2FjaGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24/LmNvYWNoSXRlbXM/LmZvckVhY2goKGNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRBcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYWxsRWxlbWVuZXRzID1cbiAgICAgICAgICAgIGZpbHRlcmVkQXJlYUVsZW1lbnRzXG4gICAgICAgICAgICAgID8uY29uY2F0KGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5jb25jYXQoY29hY2hJdGVtLnBsYWNlcyB8fCBbXSkgfHwgW107XG4gICAgICAgICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgICBhbGxFbGVtZW5ldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhcmVhRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcihcbiAgICAgICAgICAgICAgKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIHRydWUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvdGhlckVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50c1xuICAgICAgICAgICAgPy5maWx0ZXIoKGdyYXBoaWNhbEVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PlxuICAgICAgICAgICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhncmFwaGljYWxFbGVtZW50Lmljb24hKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIGZhbHNlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc2VydmljZUVsZW1lbnRzID0gY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cz8ubWFwKChlbGUpID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYm9yZGVyTWlkZGxlRWxlbWVudCA9IHRoaXMuX2dldENhbGN1bGF0ZWRNaWRkbGVCb3JkZXJFbGVtZW50KGNvYWNoSXRlbSk7XG4gICAgICAgICAgY29uc3QgY2FsY0NvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHsgLi4uY29hY2hJdGVtLmRpbWVuc2lvbiB9KTtcbiAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHNpbmdsZSBjb2FjaFxuICAgICAgICAgIGNvbnN0IGNvYWNoU3R1cmN0dXJlOiBDb2FjaFN0cnVjdHVyZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBjYWxjQ29hY2hEaW1lbnNpb24udyxcbiAgICAgICAgICAgIGhlaWdodDogY2FsY0NvYWNoRGltZW5zaW9uLmgsXG4gICAgICAgICAgICBvdGhlckVsZW1lbnRzOiBvdGhlckVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgc2VydmljZUVsZW1lbnRzOiBzZXJ2aWNlRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBhcmVhRWxlbWVudHM6IGFyZWFFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGJvcmRlck1pZGRsZUVsZW1lbnQ6IGJvcmRlck1pZGRsZUVsZW1lbnQsXG4gICAgICAgICAgICBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzOiBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmRlY2tDb2FjaGVzLnB1c2goY29hY2hTdHVyY3R1cmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrcy5wdXNoKHNlYXRSZXNlcnZhdGlvbkRlY2spO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBvZiB0aGUgbWlkZGxlIGJvcmRlci5cbiAgICogVG8gY2FsY3VsYXRlIHRoZSBzdGFydCArIGVuZCBjb29yZGluYXRlIGFuZCB0aGUgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyIGNvYWNoIGdyYXBoaWMsXG4gICAqIHRoZSBleGlzdGluZyBkb2NraW5nIGNvYWNoIGdyYXBoaWNzIGFyZSBhbmFseXNlZCBhbmQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHBvc2l0aW9uIGFuZCBkaWVtZW5zaW9uIGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJucyBCYXNlRWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2g6IENvYWNoSXRlbSk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBib3JkZXJIZWlnaHQgPSAoY29hY2guZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAvLyBEZWZhdWx0IC0gd2l0aG91dCBmaW5kaW5nIGRvY2tpbmcgYm9yZGVyIGVsZW1lbnRzLCB0aGUgbWlkZGxlIGJvcmRlciBnb2VzIGZyb20gMCBwb3NpdGlvbiB1bnRpbCBjb2FjaCB3aWR0aCBlbmRcbiAgICBsZXQgc3RhcnRCb3JkZXJPZmZzZXRYID0gMDtcbiAgICBsZXQgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udztcblxuICAgIGlmIChjb2FjaC5ncmFwaGljRWxlbWVudHMpIHtcbiAgICAgIC8vIERvY2tpbmdFbGVtZW50ZSBkZWZpbmVzIHRoZSBlbGVtZW50cyB3aGVyZSB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCByZWFsbHkgc3RhcnRzIGFuZCBlbmRzXG4gICAgICBjb25zdCBkb2NraW5nRWxlbWVudHMgPSB0aGlzLl9nZXRGaXJzdExhc3REb2NraW5nRWxlbWVudHMoY29hY2guZ3JhcGhpY0VsZW1lbnRzKTtcblxuICAgICAgLy8gVHdvIGRvY2tpbmcgY29hY2ggZWxlbWVudHMgZXhpc3QgKG5vcm1hbCBjYXNlIC0gc3RhcnQgYW5kIGVuZCBkb2NraW5nIGVsZW1lbnQpXG4gICAgICBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMikge1xuICAgICAgICBjb25zdCBmaXJzdERvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzBdO1xuICAgICAgICBjb25zdCBsYXN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMV07XG4gICAgICAgIGNvbnN0IGVuZEJvcmRlck9mZnNldFggPVxuICAgICAgICAgIGZpcnN0RG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PSAwXG4gICAgICAgICAgICA/IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuXG4gICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gZmlyc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24ud1xuICAgICAgICAgICAgOiBsYXN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGVuZEJvcmRlck9mZnNldFggLSBzdGFydEJvcmRlck9mZnNldFg7XG4gICAgICB9XG4gICAgICAvLyBPbmx5IG9uZSBkb2NraW5nIGJvcmRlciBjb2FjaCBlbGVtZW50cyBleGlzdCAoc3RhcnQgb3IgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50cz8ubGVuZ3RoID09IDEpIHtcbiAgICAgICAgY29uc3QgZG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG5cbiAgICAgICAgLy8gTWlkZGxlQm9yZGVyIHN0YXJ0cyBmcm9tIGxlZnQgZG9ja2luZyBlbGVtZW50IHVudGlsIGNvYWNoIGVuZFxuICAgICAgICBpZiAoZG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkge1xuICAgICAgICAgIHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9IGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgfVxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gcG9zaXRpb24geCAwIHVudGlsIGRvY2tpbmcgZWxlbWVudCBvbiB0aGUgcmlnaHQgY29hY2ggc2lkZVxuICAgICAgICBlbHNlIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ICE9PSAwKSB7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeU9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nICogLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHsgeDogc3RhcnRCb3JkZXJPZmZzZXRYICogdGhpcy5iYXNlR3JpZFNpemUsIHk6IHlPZmZzZXQsIHo6IDAgfSxcbiAgICAgIGRpbWVuc2lvbjogeyB3OiBib3JkZXJXaWR0aCAqIHRoaXMuYmFzZUdyaWRTaXplLCBoOiBib3JkZXJIZWlnaHQgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ3JhcGhpY2FsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYm9yZGVyIGVsZW1lbnRzIG9mIHRoZSBjb2FjaC5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRbXVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGdyYXBoaWNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IEJhc2VFbGVtZW50W10ge1xuICAgIC8vIEdldCBhbGwgcmVsZXZhbnQgZG9ja2luZyBlbGVtZW50cyBhbmQgc29ydHMgdGhlbSBhZ2FpbiBhY2NvcmRpbmcgdG8gdGhlaXIgeCBwb3NpdGlvbiBjb29yZGluYXRlcyxcbiAgICAvLyB0aHVzIHRoZSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudHMgd291bGQgYmUgZGVmaW5lZFxuICAgIGNvbnN0IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzID0gKFxuICAgICAgZ3JhcGhpY0VsZW1lbnRzLmZpbHRlcigoZWxlKSA9PiB0aGlzLm1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cy5pbmNsdWRlcyhlbGUuaWNvbiEpKSB8fCBbXVxuICAgICkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24ueDtcbiAgICAgIGNvbnN0IHBvc0IgPSBiLnBvc2l0aW9uLng7XG4gICAgICBpZiAocG9zQSA+IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpZiAocG9zQSA8IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWREb2NraW5nRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKF8sIGluZGV4KSA9PiBpbmRleCA9PSAwIHx8IGluZGV4ID09IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmxlbmd0aCAtIDEsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBncmFwaGljYWwsIHNlcnZpY2UgYW5kIGFyZWEgZWxlbWVudHNcbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoXG4gICAgZWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNDYWxjQXJlYUVsZW1lbnQ6IGJvb2xlYW4sXG4gICk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBkaW0gPSB7IC4uLmVsZW1lbnQuZGltZW5zaW9uIH07XG4gICAgY29uc3QgcG9zID0geyAuLi5lbGVtZW50LnBvc2l0aW9uIH07XG4gICAgY29uc3Qgcm90YXRpb24gPSBlbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5jb25jYXQodGhpcy5ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucykuaW5kZXhPZihlbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgY29uc3QgY2FsY1JvdGF0aW9uID1cbiAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID8gcm90YXRpb24gLSA5MCA6IHJvdGF0aW9uO1xuICAgIGxldCBhcmVhTW91bnRpbmc6IEVsZW1lbnRNb3VudGluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIEFyZWFFbGVtZW50c1xuICAgIGlmIChpc0NhbGNBcmVhRWxlbWVudCkge1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBlbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgICB0aGlzLmlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoZWxlbWVudCwgY29hY2hEaW1lbnNpb24pICYmIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuXG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmgpIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ2xvd2VyLWJvcmRlcic7XG4gICAgICAgIGlmICghc3RyZXRjaEhlaWdodCkge1xuICAgICAgICAgIHBvcy55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZXRjaEhlaWdodCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBhbGwgb3RoZXIgZ3JhcGhpY2FsIGVsZW1lbnRzXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2FjaERpbWVuc2lvbi5oID09PSBlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oKSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpbS53ID0gTWF0aC5yb3VuZChkaW0udyAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBkaW0uaCA9IE1hdGgucm91bmQoZGltLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBwb3MueCA9IE1hdGgucm91bmQocG9zLnggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG4gICAgcG9zLnkgPSBNYXRoLnJvdW5kKHBvcy55ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBlbGVtZW50Lmljb24gJiYgZWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZWxlbWVudC5pY29uPy5jb25jYXQoJ18nLCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlKVxuICAgICAgICA6IGVsZW1lbnQuaWNvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBpY29uLFxuICAgICAgcm90YXRpb246IGNhbGNSb3RhdGlvbixcbiAgICAgIGRpbWVuc2lvbjogZGltLFxuICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgIG1vdW50aW5nOiBhcmVhTW91bnRpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pc0xvY29tb3RpdmUoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJdGVtPy5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICApICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQ0EsSUFBSztDQUFMLFNBQUssaUJBQWU7Q0FDbEIsZ0JBQUEsV0FBQTtDQUNBLGdCQUFBLFVBQUE7R0FGRyxvQkFBQSxrQkFBZSxFQUFBLEVBQUE7QUE4QnBCLElBQU0seUJBQXlCO0FBQy9CLElBQU0sd0JBQWtDO0NBQ3RDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0Q7SUFFWSxvQ0FBMEI7bUJBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQUFuQyxtQ0FBbUMsWUFBVTs7O21DQU92RCxTQUFTO0lBQUUsV0FBVztJQUFxQixNQUFNO0lBQU8sQ0FBQyxDQUFBO2tDQUl6RCxTQUFTO0lBQUUsV0FBVztJQUFvQixNQUFNO0lBQVEsQ0FBQyxDQUFBO2dDQUl6RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBa0IsTUFBTTtJQUFTLENBQUMsQ0FBQTtnQ0FJeEQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxTQUFTO0lBQU0sWUFBWTtJQUFNLENBQUMsQ0FBQTsrQkFJekYsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUSxDQUFDLENBQUE7eUJBSXZELFdB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
|