@atlasauth/angular 0.16.2 → 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/esm2022/lib/components/attempt-flow.component.mjs +33 -2
- package/dist/esm2022/lib/components/flow-controller.mjs +22 -2
- package/dist/esm2022/lib/components/sign-in.component.mjs +6 -2
- package/dist/esm2022/lib/components/sign-up.component.mjs +6 -2
- package/dist/esm2022/lib/version.mjs +2 -2
- package/dist/fesm2022/atlasauth-angular.mjs +64 -5
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/components/attempt-flow.component.d.ts +4 -1
- package/dist/lib/components/flow-controller.d.ts +5 -0
- package/dist/lib/version.d.ts +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @atlasauth/angular changelog
|
|
2
2
|
|
|
3
|
+
## 0.16.3 — 2026-11-06
|
|
4
|
+
|
|
5
|
+
- The second-factor step emails the code on arrival when that's the account's only way, and offers "Use a passkey", which continues on the hosted page. Picks up the passkey origin handling from `@atlasauth/js` 0.34.2.
|
|
6
|
+
|
|
3
7
|
## 0.16.2 — 2026-11-06
|
|
4
8
|
|
|
5
9
|
- A username taken while the sign-up waited no longer shows a sign-in link beside the error. Picks up passkey promotion from `@atlasauth/js` 0.34.1.
|
|
@@ -59,6 +59,9 @@ export class AttemptFlowComponent {
|
|
|
59
59
|
/** `AtlasFlowController.emailSecondFactor()`: in flight, where it went, or why not. */
|
|
60
60
|
emailedSecondFactor = null;
|
|
61
61
|
emailSecondFactor = new EventEmitter();
|
|
62
|
+
/** "Use a passkey" at the second factor (`mfaChoices().passkey`): leaves for the hosted page. */
|
|
63
|
+
offerPasskeySecondFactor = false;
|
|
64
|
+
passkeySecondFactor = new EventEmitter();
|
|
62
65
|
/**
|
|
63
66
|
* Offer "Text me a code instead" at the second factor (where the app offers
|
|
64
67
|
* texted codes, `AtlasFlowController.mfaChoices().sms`); `smsSecondFactor`
|
|
@@ -286,7 +289,7 @@ export class AttemptFlowComponent {
|
|
|
286
289
|
}
|
|
287
290
|
}
|
|
288
291
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttemptFlowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
289
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", sessionKept: "sessionKept", titleKey: "titleKey", signInHref: "signInHref", captcha: "captcha", firstFactors: "firstFactors", preparedFactor: "preparedFactor", passwordHold: "passwordHold", holdProof: "holdProof", offerEmailSecondFactor: "offerEmailSecondFactor", emailedSecondFactor: "emailedSecondFactor", offerSmsSecondFactor: "offerSmsSecondFactor", textedSecondFactor: "textedSecondFactor", enrollment: "enrollment", enrollmentState: "enrollmentState", emailVerification: "emailVerification", matchCode: "matchCode" }, outputs: { submitFlow: "submitFlow", chooseFactor: "chooseFactor", usePassword: "usePassword", emailSecondFactor: "emailSecondFactor", smsSecondFactor: "smsSecondFactor", resend: "resend", policyDeclined: "policyDeclined" }, ngImport: i0, template: `
|
|
292
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", sessionKept: "sessionKept", titleKey: "titleKey", signInHref: "signInHref", captcha: "captcha", firstFactors: "firstFactors", preparedFactor: "preparedFactor", passwordHold: "passwordHold", holdProof: "holdProof", offerEmailSecondFactor: "offerEmailSecondFactor", emailedSecondFactor: "emailedSecondFactor", offerPasskeySecondFactor: "offerPasskeySecondFactor", offerSmsSecondFactor: "offerSmsSecondFactor", textedSecondFactor: "textedSecondFactor", enrollment: "enrollment", enrollmentState: "enrollmentState", emailVerification: "emailVerification", matchCode: "matchCode" }, outputs: { submitFlow: "submitFlow", chooseFactor: "chooseFactor", usePassword: "usePassword", emailSecondFactor: "emailSecondFactor", passkeySecondFactor: "passkeySecondFactor", smsSecondFactor: "smsSecondFactor", resend: "resend", policyDeclined: "policyDeclined" }, ngImport: i0, template: `
|
|
290
293
|
<div [class]="cls('card', 'atlas-card')">
|
|
291
294
|
<h1 [class]="cls('headerTitle', 'atlas-title')">{{ t(titleKey) }}</h1>
|
|
292
295
|
|
|
@@ -509,6 +512,18 @@ export class AttemptFlowComponent {
|
|
|
509
512
|
}
|
|
510
513
|
}
|
|
511
514
|
|
|
515
|
+
@if (offerPasskeySecondFactor && step().kind === 'collect_second_factor') {
|
|
516
|
+
<button
|
|
517
|
+
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
518
|
+
type="button"
|
|
519
|
+
data-atlas="passkey-second-factor"
|
|
520
|
+
[disabled]="busy"
|
|
521
|
+
(click)="passkeySecondFactor.emit()"
|
|
522
|
+
>
|
|
523
|
+
{{ t('mfa.enrollPasskeyOption') }}
|
|
524
|
+
</button>
|
|
525
|
+
}
|
|
526
|
+
|
|
512
527
|
@if (showEmailCodeOption()) {
|
|
513
528
|
<button
|
|
514
529
|
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
@@ -780,6 +795,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
780
795
|
}
|
|
781
796
|
}
|
|
782
797
|
|
|
798
|
+
@if (offerPasskeySecondFactor && step().kind === 'collect_second_factor') {
|
|
799
|
+
<button
|
|
800
|
+
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
801
|
+
type="button"
|
|
802
|
+
data-atlas="passkey-second-factor"
|
|
803
|
+
[disabled]="busy"
|
|
804
|
+
(click)="passkeySecondFactor.emit()"
|
|
805
|
+
>
|
|
806
|
+
{{ t('mfa.enrollPasskeyOption') }}
|
|
807
|
+
</button>
|
|
808
|
+
}
|
|
809
|
+
|
|
783
810
|
@if (showEmailCodeOption()) {
|
|
784
811
|
<button
|
|
785
812
|
[class]="cls('formButtonSecondary', 'atlas-button-secondary')"
|
|
@@ -855,6 +882,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
855
882
|
type: Input
|
|
856
883
|
}], emailSecondFactor: [{
|
|
857
884
|
type: Output
|
|
885
|
+
}], offerPasskeySecondFactor: [{
|
|
886
|
+
type: Input
|
|
887
|
+
}], passkeySecondFactor: [{
|
|
888
|
+
type: Output
|
|
858
889
|
}], offerSmsSecondFactor: [{
|
|
859
890
|
type: Input
|
|
860
891
|
}], textedSecondFactor: [{
|
|
@@ -881,4 +912,4 @@ function msg(labelKey) {
|
|
|
881
912
|
function released() {
|
|
882
913
|
return { kind: 'released', name: '', labelKey: 'signIn.passwordHoldReleased', type: 'text' };
|
|
883
914
|
}
|
|
884
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixRQUFRLEdBUVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQWdCcEM7Ozs7Ozs7OztHQVNHO0FBOFFILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLE9BQU8sR0FBdUIsSUFBSSxDQUFDO0lBQ25DLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUNuQywwRkFBMEY7SUFDakYsV0FBVyxHQUF3QixTQUFTLENBQUM7SUFDN0MsUUFBUSxHQUFHLGNBQWMsQ0FBQztJQUNuQyxrR0FBa0c7SUFDekYsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFDMUM7Ozs7T0FJRztJQUNNLE9BQU8sR0FBNkIsSUFBSSxDQUFDO0lBQ2xEOzs7O09BSUc7SUFDTSxZQUFZ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QUUsTUFBTSxFQUFFLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGF3YWl0aW5nU2lnblVwTGluayxcbiAgZW5yb2xsbWVudE9wdGlvbktleSxcbiAgZW5yb2xsbWVudFN1Ym1pdEtleSxcbiAgZ3JvdXBTZXR1cEtleSxcbiAgbG9jYWxpemVkRXJyb3JNZXNzYWdlLFxuICBuZXh0U3RlcCxcbiAgdHlwZSBBdHRlbXB0VmlldyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIEZsb3dTdGF0ZSxcbiAgdHlwZSBNZmFFbnJvbGxtZW50Q29udHJvbGxlcixcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RhdGUsXG4gIHR5cGUgTWZhRW5yb2xsbWVudFN0cmF0ZWd5LFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXRsYXNDYXB0Y2hhU2xvdERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY2FwdGNoYS1zbG90LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBQb2xpY3lBY2NlcHRTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi9wb2xpY3ktaG9zdCc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBPbmUgcmVuZGVyZWQgcm93IG9mIHRoZSBmbG93LiBBIHVuaWZvcm0gc2hhcGUgKHJhdGhlciB0aGFuIGEgZGlzY3JpbWluYXRlZFxuICogdW5pb24pIHNvIHRoZSB0ZW1wbGF0ZSBhY2Nlc3NlcyBvbmx5IGZpZWxkcyB0aGF0IGFsd2F5cyBleGlzdCDigJQgbm8gcmVsaWFuY2Ugb25cbiAqIHRlbXBsYXRlIGNvbnRyb2wtZmxvdyBuYXJyb3dpbmcgb2YgYSBsb29wIHZhcmlhYmxlLCB3aGljaCB2YXJpZXMgYnkgQW5ndWxhclxuICogbWlub3IuIEZvciBhIGBtZXNzYWdlYCByb3csIGBsYWJlbEtleWAgY2FycmllcyB0aGUgbWVzc2FnZSdzIGkxOG4ga2V5LlxuICovXG5pbnRlcmZhY2UgU3RlcEZpZWxkIHtcbiAga2luZDogJ2lucHV0JyB8ICdtZXNzYWdlJyB8ICdhbGVydCcgfCAncmVsZWFzZWQnO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsS2V5OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgYXV0b2NvbXBsZXRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXItZHJpdmVuIGZsb3cgc2hlbGwsIHNoYXJlZCBieSBgPGF0bGFzLXNpZ24taW4+YCBhbmRcbiAqIGA8YXRsYXMtc2lnbi11cD5gLiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3MgaW50ZXJuYWwgYEF0dGVtcHRGbG93YC5cbiAqXG4gKiBJdCBjb250YWlucyBOTyBkZWNpc2lvbiBhYm91dCB3aGF0IGNvbWVzIG5leHQ6IGl0IHJlbmRlcnMgd2hhdGV2ZXIgYHN0YXR1c2BcbiAqIHRoZSBzZXJ2ZXIgcmV0dXJuZWQsIG1hcHBlZCB0aHJvdWdoIGBuZXh0U3RlcGAgZnJvbSBgQGF0bGFzYXV0aC9qc2AgKHRoZSBzYW1lXG4gKiBleGhhdXN0aXZlIG1hcHBpbmcgdGhlIFJlYWN0IFNESyB1c2VzKSwgc28gYWRkaW5nIGEgc3RlcCBpcyBhIHNlcnZlciBjaGFuZ2VcbiAqIGFuZCBhbiBvdXQtb2YtZGF0ZSBjbGllbnQgZGVncmFkZXMgdG8gYSB2aXNpYmxlIFwicGxlYXNlIHVwZGF0ZVwiIG1lc3NhZ2UgcmF0aGVyXG4gKiB0aGFuIGEgYmxhbmsgc2NyZWVuLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1hdHRlbXB0LWZsb3cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUsIFBvbGljeUFjY2VwdFN0ZXBDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCh0aXRsZUtleSkgfX08L2gxPlxuXG4gICAgICBAZm9yIChlcnJvciBvZiBmb3JtRXJyb3JzKCk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgIHt7IGVycm9yVGV4dChlcnJvcikgfX1cbiAgICAgICAgICBAaWYgKHNpZ25JbkxpbmsoZXJyb3IpOyBhcyBocmVmKSB7XG4gICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJocmVmXCI+e3sgdCgnc2lnbkluLnRpdGxlJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG4gICAgICB9XG5cbiAgICAgIDxmb3JtIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGNvZGVTZW50VGV4dCgpOyBhcyBzZW50VGV4dCkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtY29kZS1zZW50PVwiXCI+e3sgc2VudFRleHQgfX08L3A+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChsaW5rU2VudFRleHQoKTsgYXMgc2VudExpbmspIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWxpbmstc2VudD1cIlwiPnt7IHNlbnRMaW5rIH19PC9wPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGlua09ubHkoKSkge1xuICAgICAgICAgIDwhLS0gTm90aGluZyB0byB0eXBlOiB0aGUgZmxvdyBwb2xscyB1bnRpbCB0aGUgZW1haWxlZCBsaW5rIGlzIG9wZW5lZCAoYW55d2hlcmUpLiAtLT5cbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWxpbmstc2VudD1cIlwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAge3sgdCgnc2lnblVwLmxpbmtTZW50VG8nLCB7IGVtYWlsOiBhdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1hdGxhcy1yZXNlbmQ9XCJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc2VuZC5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5yZXNlbmRMaW5rJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dNYXRjaENvZGUoKSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJsaW5rLW1hdGNoLWNvZGVcIj57eyB0KCdsaW5rLm1hdGNoQ29kZUhpbnQnKSB9fSA8c3Ryb25nPjxjb2RlPnt7IG1hdGNoQ29kZSB9fTwvY29kZT48L3N0cm9uZz48L3A+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChlbnJvbGxpbmcoKSAmJiBlbnJvbGxtZW50U3RhdGU7IGFzIGVucm9sKSB7XG4gICAgICAgICAgQGlmIChlbnJvbC5tZXRob2QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5lbnJvbGxDaG9vc2UnKSB9fTwvcD5cbiAgICAgICAgICAgIEBmb3IgKG0gb2YgZW5yb2wub3B0aW9uczsgdHJhY2sgbSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtbWZhLW1ldGhvZF09XCJtXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCBlbnJvbC5idXN5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlTWV0aG9kKG0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHQob3B0aW9uS2V5KG0pKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIGlmIChlbnJvbC5tZXRob2QgPT09ICd5dWJpa2V5Jykge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLnl1YmlrZXlMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm90cFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFt2YWx1ZV09XCJ2YWx1ZXNbJ290cCddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdvdHAnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdvdHAnKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGVucm9sLm1ldGhvZCA9PT0gJ2R1bycgfHwgZW5yb2wubWV0aG9kID09PSAncGFzc2tleScpIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgc2V0dXApIHtcbiAgICAgICAgICAgICAgQGlmIChlbnJvbC5tZXRob2QgPT09ICdwYXNza2V5Jykge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5lbnJvbGxQYXNza2V5SGVscCcpIH19PC9wPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIj57eyB0KCdtZmEuZW5yb2xsRHVvSGVscCcpIH19PC9wPlxuICAgICAgICAgICAgICAgIEBpZiAoc2V0dXAuYXV0aG9yaXphdGlvblVybCkge1xuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhdGxhcy1saW5rXCIgZGF0YS1hdGxhcz1cIm1mYS1kdW8tb3BlblwiIFtocmVmXT1cInNldHVwLmF1dGhvcml6YXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+e3sgdCgnbWZhLmVucm9sbER1b09wZW4nKSB9fTwvYT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyBlbnJvbC5idXN5ID8gdCgnbWZhLmVucm9sbFByZXBhcmluZycpIDogJycgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSBpZiAoZW5yb2wubWV0aG9kID09PSAndG90cCcgfHwgZW5yb2wubWV0aG9kID09PSAnaG90cCcpIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgc2V0dXApIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCI+e3sgdCgnbWZhLmVucm9sbFNjYW4nKSB9fTwvcD5cbiAgICAgICAgICAgICAgQGlmIChzZXR1cC5xckNvZGUpIHtcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXRsYXMtbWZhLXFyXCIgZGF0YS1hdGxhcz1cIm1mYS1xclwiIFtzcmNdPVwic2V0dXAucXJDb2RlXCIgW2FsdF09XCJ0KCdtZmEuZW5yb2xsUXJBbHQnKVwiIHdpZHRoPVwiMTgwXCIgaGVpZ2h0PVwiMTgwXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHVwLnNlY3JldCkge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJtZmEtc2V0dXAta2V5XCI+e3sgdCgnbWZhLmVucm9sbFNldHVwS2V5JykgfX06IDxjb2RlPnt7IHNldHVwS2V5KHNldHVwLnNlY3JldCkgfX08L2NvZGU+PC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLmVucm9sbEZpcnN0Q29kZUxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib25lLXRpbWUtY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbdmFsdWVdPVwidmFsdWVzWydjb2RlJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ2NvZGUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAoZW5yb2wubWV0aG9kID09PSAndG90cCcgJiYgZW5yb2wudG90cENvZGVzID49IDIpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLmVucm9sbFNlY29uZENvZGVMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZWNvbmRDb2RlXCIgYXV0b2NvbXBsZXRlPVwib25lLXRpbWUtY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbdmFsdWVdPVwidmFsdWVzWydzZWNvbmRDb2RlJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ3NlY29uZENvZGUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7IGVucm9sLmJ1c3kgPyB0KCdtZmEuZW5yb2xsUHJlcGFyaW5nJykgOiAnJyB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgdGV4dGVkKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJtZmEtY29kZS10ZXh0ZWRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyB0KCdtZmEuY29kZVRleHRlZFRvJywgeyBwaG9uZTogdGV4dGVkLnBob25lID8/ICcnIH0pIH19PC9wPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYS5jb2RlTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIFt2YWx1ZV09XCJ2YWx1ZXNbJ2NvZGUnXSA/PyAnJ1wiIChpbnB1dCk9XCJzZXRWYWx1ZSgnY29kZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWF0bGFzLXJlc2VuZD1cIlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgZW5yb2wuYnVzeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2VuZEVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0KCdzaWduSW4ucmVzZW5kQ29kZScpIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLnBob25lTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZWxcIiBuYW1lPVwicGhvbmVcIiBhdXRvY29tcGxldGU9XCJ0ZWxcIiBbdmFsdWVdPVwidmFsdWVzWydwaG9uZSddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdwaG9uZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCI+e3sgdCgnbWZhLnBob25lSGludCcpIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAZm9yIChlcnJvciBvZiBlbnJvbC5lcnJvcnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZW5yb2wubWV0aG9kICE9PSBudWxsICYmIGVucm9sLm9wdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgQGZvciAob3RoZXIgb2Ygb3RoZXJNZXRob2RzKGVucm9sKTsgdHJhY2sgb3RoZXIpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF0bGFzLW1mYS1tZXRob2RdPVwib3RoZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8IGVucm9sLmJ1c3lcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaG9vc2VNZXRob2Qob3RoZXIpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHQob3B0aW9uS2V5KG90aGVyKSkgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGYgb2YgZmllbGRzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIEBpZiAoZi5raW5kID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KGYubGFiZWxLZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJmLnR5cGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiZi5hdXRvY29tcGxldGUgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLm5hbWVdID8/ICcnXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5uYW1lLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYubmFtZSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChmLmtpbmQgPT09ICdyZWxlYXNlZCcpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtcGFzc3dvcmQtcmVsZWFzZWQ9XCJcIj57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGYua2luZCA9PT0gJ2FsZXJ0Jykge1xuICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IHQoZi5sYWJlbEtleSkgfX08L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8cD57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoYXdhaXRpbmdQb2xpY2llcygpKSB7XG4gICAgICAgICAgPCEtLSBBIHJlcXVpcmVkIHBvbGljeSBjaGFuZ2VkOiBzY3JvbGwtbW9kZSBvbmVzIGluIHRoZWlyIGRpYWxvZywgdGhlIHJlc3QgYXMgY2hlY2tib3hlcy4gLS0+XG4gICAgICAgICAgPGF0bGFzLXBvbGljeS1hY2NlcHQtc3RlcFxuICAgICAgICAgICAgW2F0dGVtcHRdPVwiYXR0ZW1wdFwiXG4gICAgICAgICAgICBbYnVzeV09XCJidXN5XCJcbiAgICAgICAgICAgIChzdWJtaXRGbG93KT1cInN1Ym1pdEZsb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkZWNsaW5lZCk9XCJwb2xpY3lEZWNsaW5lZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgID48L2F0bGFzLXBvbGljeS1hY2NlcHQtc3RlcD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0NhcHRjaGEoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdGxhcy1jYXB0Y2hhXCIgZGF0YS1hdGxhcy1jYXB0Y2hhPVwiXCIgW2F0bGFzQ2FwdGNoYVNsb3RdPVwiY2FwdGNoYVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93U3VibWl0KCkpIHtcbiAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgW2Rpc2FibGVkXT1cImJ1c3kgfHwgKGVucm9sbGluZygpICYmICEhZW5yb2xsbWVudFN0YXRlPy5idXN5KVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgIHt7IHQoc3VibWl0S2V5KCkpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dTbXNTZWNvbmRGYWN0b3IoKSkge1xuICAgICAgICAgIEBpZiAoc21zU2Vjb25kRmFjdG9yU2VudFRvKCk7IGFzIHNlbnRUbykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cInNtcy1zZWNvbmQtZmFjdG9yLXNlbnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAge3sgdCgnbWZhLmNvZGVUZXh0ZWRUbycsIHsgcGhvbmU6IHNlbnRUbyB9KSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWF0bGFzPVwic21zLXNlY29uZC1mYWN0b3JcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhIXRleHRlZFNlY29uZEZhY3Rvcj8uYnVzeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzbXNTZWNvbmRGYWN0b3IuZW1pdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdGV4dGVkU2Vjb25kRmFjdG9yPy5idXN5ID8gdCgnc2lnbkluLnNlbmRpbmcnKSA6IHQoJ21mYS5zbXNDb2RlT3B0aW9uJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmICh0ZXh0ZWRTZWNvbmRGYWN0b3I/LmVycm9yOyBhcyBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBtZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtYWlsU2Vjb25kRmFjdG9yKCkpIHtcbiAgICAgICAgICBAaWYgKGVtYWlsU2Vjb25kRmFjdG9yU2VudFRvKCk7IGFzIHNlbnRUbykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cImVtYWlsLXNlY29uZC1mYWN0b3Itc2VudFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgICB7eyB0KCdzaWduSW4uY29kZVNlbnRUbycsIHsgZW1haWw6IHNlbnRUbyB9KSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWF0bGFzPVwiZW1haWwtc2Vjb25kLWZhY3RvclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8ICEhZW1haWxlZFNlY29uZEZhY3Rvcj8uYnVzeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJlbWFpbFNlY29uZEZhY3Rvci5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBlbWFpbGVkU2Vjb25kRmFjdG9yPy5idXN5ID8gdCgnc2lnbkluLnNlbmRpbmcnKSA6IHQoJ3NpZ25Jbi5lbWFpbENvZGVPcHRpb24nKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKGVtYWlsZWRTZWNvbmRGYWN0b3I/LmVycm9yOyBhcyBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBtZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtYWlsQ29kZU9wdGlvbigpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXN0cmF0ZWd5XT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyBudWxsIDogJ2VtYWlsX2NvZGUnXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtcmVzZW5kXT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyAnJyA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUZhY3Rvci5lbWl0KCdlbWFpbF9jb2RlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQocHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9jb2RlJyA/ICdzaWduSW4ucmVzZW5kQ29kZScgOiAnc2lnbkluLnVzZUVtYWlsQ29kZScpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGhvbGRQcm9vZiA9PT0gJ2VtYWlsX2xpbmsnICYmIHN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXN0cmF0ZWd5XT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfbGluaycgPyBudWxsIDogJ2VtYWlsX2xpbmsnXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtcmVzZW5kXT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfbGluaycgPyAnJyA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUZhY3Rvci5lbWl0KCdlbWFpbF9saW5rJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQocHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJyA/ICdzaWduSW4ucmVzZW5kTGluaycgOiAnc2lnbkluLnVzZUVtYWlsTGluaycpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHByZXBhcmVkRmFjdG9yICYmIG9mZmVyZWQoKS5pbmNsdWRlcygncGFzc3dvcmQnKSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1zdHJhdGVneT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1c2VQYXNzd29yZC5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5wYXNzd29yZE9wdGlvbicpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQXR0ZW1wdEZsb3dDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgQElucHV0KCkgYXR0ZW1wdDogQXR0ZW1wdFZpZXcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnVzeSA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcnM6IEZpZWxkRXJyb3JbXSA9IFtdO1xuICAvKiogYEZsb3dTdGF0ZS5zZXNzaW9uS2VwdGA6IHdoZXRoZXIgdGhpcyBicm93c2VyIGtlcHQgdGhlIHNlc3Npb24gdGhlIHNpZ24taW4gY3JlYXRlZC4gKi9cbiAgQElucHV0KCkgc2Vzc2lvbktlcHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHRpdGxlS2V5ID0gJ3NpZ25Jbi50aXRsZSc7XG4gIC8qKiBTaWduLXVwIG9ubHk6IHRoZSBzaWduLWluIGxpbmsgYmVzaWRlIHRoZSBjb2RlIHN0ZXAncyBcImFuIGFjY291bnQgYWxyZWFkeSB1c2VzIHRoaXMgZW1haWxcIi4gKi9cbiAgQElucHV0KCkgc2lnbkluSHJlZjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgc2lnbi1pbiBjYXB0Y2hhLCBkcmF3biBhYm92ZSB0aGUgc3VibWl0IGJ1dHRvbiBvbiB0aGUgaWRlbnRpZmllciBzdGVwXG4gICAqIChhbiBhbHdheXMtb24gc2lnbi1pbiBjYXB0Y2hhKSBhbmQgb24gdGhlIGNoYWxsZW5nZSBzdGVwIHRoZSBzZXJ2ZXIgZGVtYW5kc1xuICAgKiB3aXRoIGBuZWVkc19jYXB0Y2hhYC4gTnVsbCB3aGVuIHRoZSBmbG93IGRyYXdzIG5vbmUuXG4gICAqL1xuICBASW5wdXQoKSBjYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvcnMgdG8gb2ZmZXIgb24gdGhlIGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHBhc3NcbiAgICogYEF0bGFzRmxvd0NvbnRyb2xsZXIuZmlyc3RGYWN0b3JzKClgLCB3aGljaCBkcm9wcyBlbWFpbCBjb2RlIC8gbGluayB3aGlsZSB0aGVcbiAgICogYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsLiBOdWxsIHVzZXMgdGhlIHNlcnZlcidzIGxpc3QgYXMtaXMuXG4gICAqL1xuICBASW5wdXQoKSBmaXJzdEZhY3RvcnM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZmlyc3QgZmFjdG9yIGFscmVhZHkgc2VudCAoYEF0bGFzRmxvd0NvbnRyb2xsZXIucHJlcGFyZWRGYWN0b3IoKWApOiBpdHMgY29kZSBpcyBjb2xsZWN0ZWQuICovXG4gIEBJbnB1dCgpIHByZXBhcmVkRmFjdG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIGBGbG93U3RhdGUucGFzc3dvcmRIb2xkYDogd2hlcmUgdGhlIHByb29mIHdlbnQsIGFuZCB3aGV0aGVyIHRoZSBwYXNzd29yZCBzaWducyBpbiBub3cuICovXG4gIEBJbnB1dCgpIHBhc3N3b3JkSG9sZDogRmxvd1N0YXRlWydwYXNzd29yZEhvbGQnXSA9IG51bGw7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5ob2xkUHJvb2YoKWA6IHRoZSBlbWFpbGVkIHByb29mIGEgcGFzc3dvcmQgaG9sZCBzdGlsbCB3YWl0cyBvbi4gKi9cbiAgQElucHV0KCkgaG9sZFByb29mOiAnZW1haWxfY29kZScgfCAnZW1haWxfbGluaycgfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgdGhlIGNvbGxlY3RlZCBmaWVsZCB2YWx1ZXMgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICovXG4gIEBPdXRwdXQoKSBzdWJtaXRGbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBwaWNrcyBhIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIG11c3Qgc2VuZCBmaXJzdCAoYW4gZW1haWxlZCBjb2RlKS4gKi9cbiAgQE91dHB1dCgpIGNob29zZUZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8J2VtYWlsX2NvZGUnIHwgJ2VtYWlsX2xpbmsnPigpO1xuICAvKiogRW1pdHMgb24gXCJVc2UgeW91ciBwYXNzd29yZCBpbnN0ZWFkXCIsIGZyb20gYW4gZW1haWxlZCBmYWN0b3IgYWxyZWFkeSBzZW50LiAqL1xuICBAT3V0cHV0KCkgdXNlUGFzc3dvcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBPZmZlciBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LmVtYWlsU2Vjb25kRmFjdG9yYCk7IGBlbWFpbFNlY29uZEZhY3RvcmAgYXNrcyBmb3IgaXQgYW5kXG4gICAqIGBlbWFpbGVkU2Vjb25kRmFjdG9yYCByZXBvcnRzIGhvdyBpdCB3ZW50LlxuICAgKi9cbiAgQElucHV0KCkgb2ZmZXJFbWFpbFNlY29uZEZhY3RvciA9IGZhbHNlO1xuICAvKiogYEF0bGFzRmxvd0NvbnRyb2xsZXIuZW1haWxTZWNvbmRGYWN0b3IoKWA6IGluIGZsaWdodCwgd2hlcmUgaXQgd2VudCwgb3Igd2h5IG5vdC4gKi9cbiAgQElucHV0KCkgZW1haWxlZFNlY29uZEZhY3RvcjogeyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSBlbWFpbFNlY29uZEZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIE9mZmVyIFwiVGV4dCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh3aGVyZSB0aGUgYXBwIG9mZmVyc1xuICAgKiB0ZXh0ZWQgY29kZXMsIGBBdGxhc0Zsb3dDb250cm9sbGVyLm1mYUNob2ljZXMoKS5zbXNgKTsgYHNtc1NlY29uZEZhY3RvcmBcbiAgICogYXNrcyBmb3IgaXQgYW5kIGB0ZXh0ZWRTZWNvbmRGYWN0b3JgIHJlcG9ydHMgaG93IGl0IHdlbnQuXG4gICAqL1xuICBASW5wdXQoKSBvZmZlclNtc1NlY29uZEZhY3RvciA9IGZhbHNlO1xuICAvKiogYEF0bGFzRmxvd0NvbnRyb2xsZXIuc21zU2Vjb25kRmFjdG9yKClgOiBpbiBmbGlnaHQsIHdoZXJlIGl0IHdlbnQsIG9yIHdoeSBub3QuICovXG4gIEBJbnB1dCgpIHRleHRlZFNlY29uZEZhY3RvcjogeyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSBzbXNTZWNvbmRGYWN0b3IgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBUaGUgTUZBIGVucm9sbWVudCBzdGVwIChgQXRsYXNGbG93Q29udHJvbGxlci5lbnJvbGxtZW50YCBhbmRcbiAgICogYGVucm9sbG1lbnRTdGF0ZSgpYCk6IHRoZSBhdXRoZW50aWNhdG9yIGFwcCdzIFFSIGNvZGUgYW5kIHNldHVwIGtleSwgb3IgYVxuICAgKiB0ZXh0ZWQgY29kZS4gTnVsbDogdGhlIHN0ZXAgYXNrcyBmb3IgdHdvIGF1dGhlbnRpY2F0b3IgY29kZXMgb25seS5cbiAgICovXG4gIEBJbnB1dCgpIGVucm9sbG1lbnQ6IE1mYUVucm9sbG1lbnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVucm9sbG1lbnRTdGF0ZTogTWZhRW5yb2xsbWVudFN0YXRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBgYWNjb3VudC5lbWFpbFZlcmlmaWNhdGlvbmAuIE9uIGBsaW5rYCBhIHNpZ24tdXAnc1xuICAgKiB2ZXJpZmljYXRpb24gc3RlcCBoYXMgbm90aGluZyB0byB0eXBlOiBpdCBzYXlzIHRvIG9wZW4gdGhlIGVtYWlsZWQgbGlua1xuICAgKiB3aGlsZSB0aGUgZmxvdyBwb2xscywgYW5kIG9mZmVycyBhIHJlc2VuZCAoYHJlc2VuZGApLlxuICAgKi9cbiAgQElucHV0KCkgZW1haWxWZXJpZmljYXRpb246IHN0cmluZyA9ICdjb2RlJztcbiAgLyoqIGBGbG93U3RhdGUubWF0Y2hDb2RlYDogc2hvd24gd2hpbGUgYSBtYWlsZWQgbGluayB3YWl0cywgdG8gdHlwZSBpZiBpdCdzIG9wZW5lZCBvbiBhbm90aGVyIGRldmljZS4gKi9cbiAgQElucHV0KCkgbWF0Y2hDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIHJlc2VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIFRoZSB1c2VyIGRlY2xpbmVkIGEgcG9saWN5IHRoZSBzaWduLWluIHdhcyB3YWl0aW5nIG9uIChgbmVlZHNfcG9saWN5X2FjY2VwdGFuY2VgKTogY2FuY2VsIHRoZSBhdHRlbXB0LiAqL1xuICBAT3V0cHV0KCkgcG9saWN5RGVjbGluZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgLyoqIEEgc2VydmVyIGVycm9yIGluIHRoZSBhcHAncyBsYW5ndWFnZSAoYGVycm9yLjxyZWFzb24+YCwgZWxzZSB0aGUgc2VydmVyJ3MgbWVzc2FnZSkuICovXG4gIHByb3RlY3RlZCBlcnJvclRleHQoZXJyb3I6IEZpZWxkRXJyb3IpOiBzdHJpbmcge1xuICAgIC8vIGBlcnJvckxvY2FsaXphdGlvbmAgaXMgcmVhZCBkZWZlbnNpdmVseTogYSBzdGFuZC1pbiBzZXJ2aWNlIG1heSBsYWNrIGl0LlxuICAgIGNvbnN0IGxheWVyID0gKHRoaXMuYXRsYXMgYXMgeyBlcnJvckxvY2FsaXphdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkuZXJyb3JMb2NhbGl6YXRpb247XG4gICAgcmV0dXJuIGxvY2FsaXplZEVycm9yTWVzc2FnZShlcnJvciwgbGF5ZXIgPz8gdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIHRoaXMuYXRsYXMubG9jYWxpemF0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbHMoa2V5OiBFbGVtZW50S2V5LCBiYXNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbGFzc0ZvcihrZXksIHRoaXMuYXRsYXMuYXBwZWFyYW5jZSwgYmFzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB7IC4uLnRoaXMudmFsdWVzLCBbbmFtZV06IHZhbHVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdWJtaXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBFbnJvbG1lbnQ6IHRleHQgdGhlIGNvZGUgdG8gdGhlIHR5cGVkIG51bWJlciwgb3IgY29uZmlybSB0aGUgZmFjdG9yLlxuICAgIGlmICh0aGlzLmVucm9sbGluZygpICYmIHRoaXMuZW5yb2xsbWVudCkge1xuICAgICAgdm9pZCB0aGlzLmVucm9sbG1lbnQuc3VibWl0KHRoaXMudmFsdWVzKS50aGVuKChuZXh0KSA9PiB7XG4gICAgICAgIGlmIChuZXh0KSB0aGlzLnN1Ym1pdEZsb3cuZW1pdChuZXh0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPbmx5IHdoYXQgaXMgb24gc2NyZWVuOiBhIGNvZGUgdHlwZWQgZWFybGllciBtdXN0IG5vdCB0dXJuIGEgcGFzc3dvcmQgaW50byBhIGNvZGUgYXR0ZW1wdC5cbiAgICBpZiAodGhpcy5zdGVwKCkua2luZCA9PT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykge1xuICAgICAgdGhpcy5zdWJtaXRGbG93LmVtaXQodGhpcy5wcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnID8geyBjb2RlOiB0aGlzLnZhbHVlc1snY29kZSddID8/ICcnIH0gOiB7IHBhc3N3b3JkOiB0aGlzLnZhbHVlc1sncGFzc3dvcmQnXSA/PyAnJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdWJtaXRGbG93LmVtaXQodGhpcy52YWx1ZXMpO1xuICB9XG5cbiAgLyoqIFRoZSBzaGFyZWQgZW5yb2xtZW50IHN0ZXAgaXMgZHJhd24gKGEgY29udHJvbGxlciB3YXMgcGFzc2VkIGFuZCB0aGUgZmxvdyBpcyBlbnJvbGxpbmcpLiAqL1xuICBwcm90ZWN0ZWQgZW5yb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnZW5yb2xsX3NlY29uZF9mYWN0b3InICYmICEhdGhpcy5lbnJvbGxtZW50ICYmICEhdGhpcy5lbnJvbGxtZW50U3RhdGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hvb3NlTWV0aG9kKG1ldGhvZDogTWZhRW5yb2xsbWVudFN0cmF0ZWd5KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB2b2lkIHRoaXMuZW5yb2xsbWVudD8uY2hvb3NlKG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZW5kRW5yb2xsbWVudCgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZW5yb2xsbWVudD8ucmVzZW5kKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3B0aW9uS2V5KG1ldGhvZDogTWZhRW5yb2xsbWVudFN0cmF0ZWd5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5yb2xsbWVudE9wdGlvbktleShtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dNYXRjaENvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5tYXRjaENvZGUgJiYgKHRoaXMuc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X2VtYWlsX2NvZGUnIHx8IHRoaXMubGlua1NlbnRUZXh0KCkgIT09IG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG90aGVyTWV0aG9kcyhzdGF0ZTogTWZhRW5yb2xsbWVudFN0YXRlKTogTWZhRW5yb2xsbWVudFN0cmF0ZWd5W10ge1xuICAgIHJldHVybiBzdGF0ZS5vcHRpb25zLmZpbHRlcigobSkgPT4gbSAhPT0gc3RhdGUubWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEtleShzZWNyZXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdyb3VwU2V0dXBLZXkoc2VjcmV0KTtcbiAgfVxuXG4gIC8qKiBUaGUgc3VibWl0IGJ1dHRvbidzIGxhYmVsIGtleSAoZW5yb2xtZW50OiBcIlRleHQgbWUgYSBjb2RlXCIgYmVmb3JlIHRoZSBudW1iZXIgaXMgc2VudCkuICovXG4gIHByb3RlY3RlZCBzdWJtaXRLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50U3RhdGUgJiYgZW5yb2xsbWVudFN1Ym1pdEtleSh0aGlzLmVucm9sbG1lbnRTdGF0ZSkpIHx8ICdzaWduSW4uc3VibWl0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U21zU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyU21zU2Vjb25kRmFjdG9yICYmIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X3NlY29uZF9mYWN0b3InO1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSB0ZXh0ZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBzbXNTZWNvbmRGYWN0b3JTZW50VG8oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VudCA9IHRoaXMudGV4dGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtRXJyb3JzKCk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+ICFlcnJvci5wYXJhbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2lnbkluTGluayhlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9lbWFpbF9jb2RlJyAmJiBlcnJvci5jb2RlID09PSAnSURFTlRJRklFUl9FWElTVFMnICYmIGVycm9yLm1ldGE/LlsnaWRlbnRpZmllciddICE9PSAndXNlcm5hbWUnID8gdGhpcy5zaWduSW5IcmVmIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWVsZEVycm9yc0ZvcihuYW1lOiBzdHJpbmcpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXJhbSA9PT0gbmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRlbXB0ID8gbmV4dFN0ZXAodGhpcy5hdHRlbXB0KSA6ICh7IGtpbmQ6ICdjb2xsZWN0X2lkZW50aWZpZXInIH0gYXMgY29uc3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dDYXB0Y2hhKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLnN0ZXAoKS5raW5kO1xuICAgIHJldHVybiAhIXRoaXMuY2FwdGNoYSAmJiAoa2luZCA9PT0gJ2NvbGxlY3RfaWRlbnRpZmllcicgfHwga2luZCA9PT0gJ2NvbGxlY3RfY2FwdGNoYScpO1xuICB9XG5cbiAgLyoqIFRoZSBmaXJzdCBmYWN0b3JzIG9uIG9mZmVyIGF0IGEgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcCAoZW1wdHkgb24gYW55IG90aGVyKS4gKi9cbiAgcHJvdGVjdGVkIG9mZmVyZWQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAoKTtcbiAgICBpZiAoc3RlcC5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RGYWN0b3JzID8/IHN0ZXAuc3RyYXRlZ2llcztcbiAgfVxuXG4gIHByb3RlY3RlZCBsaW5rT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXdhaXRpbmdTaWduVXBMaW5rKHRoaXMuYXR0ZW1wdCwgdGhpcy5lbWFpbFZlcmlmaWNhdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0VtYWlsU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyRW1haWxTZWNvbmRGYWN0b3IgJiYgdGhpcy5zdGVwKCkua2luZCA9PT0gJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGVtYWlsZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBlbWFpbFNlY29uZEZhY3RvclNlbnRUbygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZW50ID0gdGhpcy5lbWFpbGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RW1haWxDb2RlT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJlZm9yZSB0aGUgY29kZSBpcyBzZW50OiB0aGUgY2hvaWNlIChvciB0aGUgcmV0cnkgb2YgYSBmYWlsZWQgYXV0b21hdGljXG4gICAgLy8gc2VuZCkuIEFmdGVyOiBcIlJlc2VuZCBjb2RlXCIuXG4gICAgcmV0dXJuIHRoaXMub2ZmZXJlZCgpLmluY2x1ZGVzKCdlbWFpbF9jb2RlJyk7XG4gIH1cblxuICAvKiogVGhlIFwid2Ugc2VudCBhIGNvZGUgdG8g4oCmXCIgbGluZSBvbiB0aGUgY29kZSBzdGVwLiAqL1xuICBwcm90ZWN0ZWQgY29kZVNlbnRUZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudCgnc2lnbkluLmNvZGVTZW50VG8nLCB7IGVtYWlsOiB0aGlzLnBhc3N3b3JkSG9sZD8uZW1haWwgPz8gdGhpcy5hdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBcIndlIHNlbnQgYSBsaW5rIHRvIOKAplwiIGxpbmUsIG9uY2UgYSBsaW5rIHdhcyBzZW50LiAqL1xuICBwcm90ZWN0ZWQgbGlua1NlbnRUZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IgIT09ICdlbWFpbF9saW5rJykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudCgnc2lnbkluLmxpbmtTZW50VG8nLCB7IGVtYWlsOiB0aGlzLnBhc3N3b3JkSG9sZD8uZW1haWwgPz8gdGhpcy5hdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGlzIGBuZWVkc19wb2xpY3lfYWNjZXB0YW5jZWAuICovXG4gIHByb3RlY3RlZCBhd2FpdGluZ1BvbGljaWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnYWNjZXB0X3BvbGljaWVzJztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLnN0ZXAoKS5raW5kO1xuICAgIC8vIE5vdGhpbmcgdG8gc3VibWl0IG9uIGEgZmlyc3QtZmFjdG9yIHN0ZXAgdGhhdCBvbmx5IG9mZmVycyBhbiBlbWFpbGVkIGNvZGVcbiAgICAvLyB1bnRpbCB0aGF0IGNvZGUgaXMgc2VudC5cbiAgICBpZiAoa2luZCA9PT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykgcmV0dXJuIHRoaXMuZmllbGRzKCkuc29tZSgoZikgPT4gZi5raW5kID09PSAnaW5wdXQnKTtcbiAgICBpZiAodGhpcy5saW5rT25seSgpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRW5yb2xtZW50OiBub3RoaW5nIHRvIHN1Ym1pdCB3aGlsZSBjaG9vc2luZyBhIG1ldGhvZCBvciBmZXRjaGluZyB0aGUgc2V0dXAuXG4gICAgaWYgKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50U3RhdGUgJiYgIWVucm9sbG1lbnRTdWJtaXRLZXkodGhpcy5lbnJvbGxtZW50U3RhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtpbmQgIT09ICdkb25lJyAmJiBraW5kICE9PSAnYXdhaXRfb2F1dGgnICYmIGtpbmQgIT09ICdhY2NlcHRfcG9saWNpZXMnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkcygpOiBTdGVwRmllbGRbXSB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCgpO1xuICAgIHN3aXRjaCAoc3RlcC5raW5kKSB7XG4gICAgICBjYXNlICdjb2xsZWN0X2lkZW50aWZpZXInOlxuICAgICAgICAvLyBgd2ViYXV0aG5gOiBzYXZlZCBwYXNza2V5cyBhcHBlYXIgaW4gdGhpcyBmaWVsZCdzIGF1dG9maWxsIHdoaWxlIDxhdGxhcy1zaWduLWluPiBob2xkcyBhIGNvbmRpdGlvbmFsIHJlcXVlc3QuXG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnaWRlbnRpZmllcicsIGxhYmVsS2V5OiAnc2lnbkluLmlkZW50aWZpZXJMYWJlbCcsIHR5cGU6ICdlbWFpbCcsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lIHdlYmF1dGhuJyB9XTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJzoge1xuICAgICAgICBpZiAodGhpcy5wcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdzaWduSW4uZW1haWxDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJykgcmV0dXJuIFtdO1xuICAgICAgICAvLyBUaGUgcGFzc3dvcmQgZmllbGQgdW5sZXNzIHRoZSBvbmx5IG9mZmVyIGlzIGFuIGVtYWlsZWQgY29kZSAoY2hvc2VuXG4gICAgICAgIC8vIHdpdGggdGhlIGJ1dHRvbiBiZWxvdyB0aGUgZm9ybSkuXG4gICAgICAgIGNvbnN0IG9mZmVyZWQgPSB0aGlzLm9mZmVyZWQoKTtcbiAgICAgICAgcmV0dXJuIG9mZmVyZWQuaW5jbHVkZXMoJ2VtYWlsX2NvZGUnKSAmJiAhb2ZmZXJlZC5pbmNsdWRlcygncGFzc3dvcmQnKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGFzc3dvcmRIb2xkPy5yZWxlYXNlZCA/IFtyZWxlYXNlZCgpXSA6IFtdKSxcbiAgICAgICAgICAgICAgeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3NpZ25Jbi5wYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9LFxuICAgICAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnbWZhLmNvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgIGNhc2UgJ2Vucm9sbF9zZWNvbmRfZmFjdG9yJzpcbiAgICAgICAgLy8gVGhlIHNoYXJlZCBlbnJvbG1lbnQgc3RlcCBkcmF3cyBpdHMgb3duIGZpZWxkcyAoYWJvdmUpLlxuICAgICAgICBpZiAodGhpcy5lbnJvbGxpbmcoKSkgcmV0dXJuIFtdO1xuICAgICAgICAvLyBUd28gY29uc2VjdXRpdmUgY29kZXMgKMKnNS42KTogYSBwaG9uZSB3aXRoIGEgZmFzdCBjbG9jayBmYWlscyBoZXJlXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIG9uIGV2ZXJ5IHNpZ24taW4gYWZ0ZXJ3YXJkcy5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdtZmEuZW5yb2xsRmlyc3RDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgICB7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdzZWNvbmRDb2RlJywgbGFiZWxLZXk6ICdtZmEuZW5yb2xsU2Vjb25kQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIF07XG4gICAgICBjYXNlICdjb2xsZWN0X2VtYWlsX2NvZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5saW5rT25seSgpID8gW10gOiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnc2lnbkluLmVtYWlsQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9uZXdfcGFzc3dvcmQnOlxuICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ3Bhc3N3b3JkJywgbGFiZWxLZXk6ICdyZXNldC5uZXdQYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9XTtcbiAgICAgIGNhc2UgJ2FjY2VwdF9wb2xpY2llcyc6XG4gICAgICAgIC8vIERyYXduIGJ5IDxhdGxhcy1wb2xpY3ktYWNjZXB0LXN0ZXA+IGFib3ZlLlxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlICdjb2xsZWN0X2NhcHRjaGEnOlxuICAgICAgICAvLyDCpzUgdGhlIHNlcnZlciB3aXRoaGVsZCB0aGUgYXR0ZW1wdCB1bnRpbCBhIGNhcHRjaGEgY2xlYXJzLiBTb2x2aW5nIHRoZVxuICAgICAgICAvLyB3aWRnZXQgcmVzdWJtaXRzIHRoZSBpZGVudGlmaWVyIG9uIGl0cyBvd247IHRoZSBidXR0b24gcmV0cmllcy5cbiAgICAgICAgcmV0dXJuIFttc2coJ2NhcHRjaGEucHJvbXB0JyldO1xuICAgICAgY2FzZSAnYXdhaXRfb2F1dGgnOlxuICAgICAgICByZXR1cm4gW21zZygnc2lnbkluLm1hZ2ljTGlua1NlbnQnKV07XG4gICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgLy8gU2lnbmVkIGluIG9ubHkgd2hlbiB0aGlzIGJyb3dzZXIgaG9sZHMgdGhlIHNlc3Npb247IGEgYmxvY2tlZCBjb29raWUgaXMgc2FpZFxuICAgICAgICAvLyBwbGFpbmx5LiBcIkNoZWNrIHRoZSBvdGhlciB0YWJcIiBpcyBmb3IgYSBzaWduLWluIGNvbXBsZXRlZCBvbiBhbm90aGVyIGRldmljZS5cbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbktlcHQgPT09IHRydWUpIHJldHVybiBbbXNnKCdzaWduSW4uc2lnbmVkSW4nKV07XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25LZXB0ID09PSBmYWxzZSkgcmV0dXJuIFt7IGtpbmQ6ICdhbGVydCcsIG5hbWU6ICcnLCBsYWJlbEtleTogJ3NpZ25Jbi5zZXNzaW9uTm90S2VwdCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgICAgcmV0dXJuIFttc2coJ3NpZ25Jbi5jaGVja090aGVyVGFiJyldO1xuICAgICAgY2FzZSAncmVzdGFydCc6XG4gICAgICAgIHJldHVybiBbbXNnKCdlcnJvci5nZW5lcmljJyldO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQSBzdGF0dXMgdGhpcyBTREsgdmVyc2lvbiBkb2VzIG5vdCBrbm93LiBBbiBob25lc3QgbWVzc2FnZSBiZWF0cyBhXG4gICAgICAgIC8vIGJsYW5rIGxvZ2luIGJveCB0aGUgdXNlciBjYW5ub3QgYWN0IG9uLlxuICAgICAgICByZXR1cm4gW21zZygnZXJyb3IuZ2VuZXJpYycpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEEgcmVhZC1vbmx5IG1lc3NhZ2Ugcm93OiBgbGFiZWxLZXlgIGhvbGRzIHRoZSBpMThuIGtleSBvZiB0aGUgdGV4dCB0byBzaG93LiAqL1xuZnVuY3Rpb24gbXNnKGxhYmVsS2V5OiBzdHJpbmcpOiBTdGVwRmllbGQge1xuICByZXR1cm4geyBraW5kOiAnbWVzc2FnZScsIG5hbWU6ICcnLCBsYWJlbEtleSwgdHlwZTogJ3RleHQnIH07XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VkKCk6IFN0ZXBGaWVsZCB7XG4gIHJldHVybiB7IGtpbmQ6ICdyZWxlYXNlZCcsIG5hbWU6ICcnLCBsYWJlbEtleTogJ3NpZ25Jbi5wYXNzd29yZEhvbGRSZWxlYXNlZCcsIHR5cGU6ICd0ZXh0JyB9O1xufVxuIl19
|
|
915
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixRQUFRLEdBUVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQWdCcEM7Ozs7Ozs7OztHQVNHO0FBMFJILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLE9BQU8sR0FBdUIsSUFBSSxDQUFDO0lBQ25DLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUNuQywwRkFBMEY7SUFDakYsV0FBVyxHQUF3QixTQUFTLENBQUM7SUFDN0MsUUFBUSxHQUFHLGNBQWMsQ0FBQztJQUNuQyxrR0FBa0c7SUFDekYsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFDMUM7Ozs7T0FJRztJQUNNLE9BQU8sR0FBNkIsSUFBSSxDQUFDO0lBQ2xEOzs7O09BSUc7SUFDTSxZQUFZ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QUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGF3YWl0aW5nU2lnblVwTGluayxcbiAgZW5yb2xsbWVudE9wdGlvbktleSxcbiAgZW5yb2xsbWVudFN1Ym1pdEtleSxcbiAgZ3JvdXBTZXR1cEtleSxcbiAgbG9jYWxpemVkRXJyb3JNZXNzYWdlLFxuICBuZXh0U3RlcCxcbiAgdHlwZSBBdHRlbXB0VmlldyxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIEZsb3dTdGF0ZSxcbiAgdHlwZSBNZmFFbnJvbGxtZW50Q29udHJvbGxlcixcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RhdGUsXG4gIHR5cGUgTWZhRW5yb2xsbWVudFN0cmF0ZWd5LFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXRsYXNDYXB0Y2hhU2xvdERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY2FwdGNoYS1zbG90LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBQb2xpY3lBY2NlcHRTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi9wb2xpY3ktaG9zdCc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBPbmUgcmVuZGVyZWQgcm93IG9mIHRoZSBmbG93LiBBIHVuaWZvcm0gc2hhcGUgKHJhdGhlciB0aGFuIGEgZGlzY3JpbWluYXRlZFxuICogdW5pb24pIHNvIHRoZSB0ZW1wbGF0ZSBhY2Nlc3NlcyBvbmx5IGZpZWxkcyB0aGF0IGFsd2F5cyBleGlzdCDigJQgbm8gcmVsaWFuY2Ugb25cbiAqIHRlbXBsYXRlIGNvbnRyb2wtZmxvdyBuYXJyb3dpbmcgb2YgYSBsb29wIHZhcmlhYmxlLCB3aGljaCB2YXJpZXMgYnkgQW5ndWxhclxuICogbWlub3IuIEZvciBhIGBtZXNzYWdlYCByb3csIGBsYWJlbEtleWAgY2FycmllcyB0aGUgbWVzc2FnZSdzIGkxOG4ga2V5LlxuICovXG5pbnRlcmZhY2UgU3RlcEZpZWxkIHtcbiAga2luZDogJ2lucHV0JyB8ICdtZXNzYWdlJyB8ICdhbGVydCcgfCAncmVsZWFzZWQnO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsS2V5OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgYXV0b2NvbXBsZXRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXItZHJpdmVuIGZsb3cgc2hlbGwsIHNoYXJlZCBieSBgPGF0bGFzLXNpZ24taW4+YCBhbmRcbiAqIGA8YXRsYXMtc2lnbi11cD5gLiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3MgaW50ZXJuYWwgYEF0dGVtcHRGbG93YC5cbiAqXG4gKiBJdCBjb250YWlucyBOTyBkZWNpc2lvbiBhYm91dCB3aGF0IGNvbWVzIG5leHQ6IGl0IHJlbmRlcnMgd2hhdGV2ZXIgYHN0YXR1c2BcbiAqIHRoZSBzZXJ2ZXIgcmV0dXJuZWQsIG1hcHBlZCB0aHJvdWdoIGBuZXh0U3RlcGAgZnJvbSBgQGF0bGFzYXV0aC9qc2AgKHRoZSBzYW1lXG4gKiBleGhhdXN0aXZlIG1hcHBpbmcgdGhlIFJlYWN0IFNESyB1c2VzKSwgc28gYWRkaW5nIGEgc3RlcCBpcyBhIHNlcnZlciBjaGFuZ2VcbiAqIGFuZCBhbiBvdXQtb2YtZGF0ZSBjbGllbnQgZGVncmFkZXMgdG8gYSB2aXNpYmxlIFwicGxlYXNlIHVwZGF0ZVwiIG1lc3NhZ2UgcmF0aGVyXG4gKiB0aGFuIGEgYmxhbmsgc2NyZWVuLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1hdHRlbXB0LWZsb3cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUsIFBvbGljeUFjY2VwdFN0ZXBDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCh0aXRsZUtleSkgfX08L2gxPlxuXG4gICAgICBAZm9yIChlcnJvciBvZiBmb3JtRXJyb3JzKCk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgIHt7IGVycm9yVGV4dChlcnJvcikgfX1cbiAgICAgICAgICBAaWYgKHNpZ25JbkxpbmsoZXJyb3IpOyBhcyBocmVmKSB7XG4gICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJocmVmXCI+e3sgdCgnc2lnbkluLnRpdGxlJykgfX08L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG4gICAgICB9XG5cbiAgICAgIDxmb3JtIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGNvZGVTZW50VGV4dCgpOyBhcyBzZW50VGV4dCkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtY29kZS1zZW50PVwiXCI+e3sgc2VudFRleHQgfX08L3A+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChsaW5rU2VudFRleHQoKTsgYXMgc2VudExpbmspIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWxpbmstc2VudD1cIlwiPnt7IHNlbnRMaW5rIH19PC9wPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGlua09ubHkoKSkge1xuICAgICAgICAgIDwhLS0gTm90aGluZyB0byB0eXBlOiB0aGUgZmxvdyBwb2xscyB1bnRpbCB0aGUgZW1haWxlZCBsaW5rIGlzIG9wZW5lZCAoYW55d2hlcmUpLiAtLT5cbiAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBkYXRhLWF0bGFzLWxpbmstc2VudD1cIlwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAge3sgdCgnc2lnblVwLmxpbmtTZW50VG8nLCB7IGVtYWlsOiBhdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1hdGxhcy1yZXNlbmQ9XCJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc2VuZC5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5yZXNlbmRMaW5rJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dNYXRjaENvZGUoKSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJsaW5rLW1hdGNoLWNvZGVcIj57eyB0KCdsaW5rLm1hdGNoQ29kZUhpbnQnKSB9fSA8c3Ryb25nPjxjb2RlPnt7IG1hdGNoQ29kZSB9fTwvY29kZT48L3N0cm9uZz48L3A+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChlbnJvbGxpbmcoKSAmJiBlbnJvbGxtZW50U3RhdGU7IGFzIGVucm9sKSB7XG4gICAgICAgICAgQGlmIChlbnJvbC5tZXRob2QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5lbnJvbGxDaG9vc2UnKSB9fTwvcD5cbiAgICAgICAgICAgIEBmb3IgKG0gb2YgZW5yb2wub3B0aW9uczsgdHJhY2sgbSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtbWZhLW1ldGhvZF09XCJtXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCBlbnJvbC5idXN5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlTWV0aG9kKG0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHQob3B0aW9uS2V5KG0pKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIGlmIChlbnJvbC5tZXRob2QgPT09ICd5dWJpa2V5Jykge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLnl1YmlrZXlMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm90cFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFt2YWx1ZV09XCJ2YWx1ZXNbJ290cCddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdvdHAnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdvdHAnKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGVucm9sLm1ldGhvZCA9PT0gJ2R1bycgfHwgZW5yb2wubWV0aG9kID09PSAncGFzc2tleScpIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgc2V0dXApIHtcbiAgICAgICAgICAgICAgQGlmIChlbnJvbC5tZXRob2QgPT09ICdwYXNza2V5Jykge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5lbnJvbGxQYXNza2V5SGVscCcpIH19PC9wPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIj57eyB0KCdtZmEuZW5yb2xsRHVvSGVscCcpIH19PC9wPlxuICAgICAgICAgICAgICAgIEBpZiAoc2V0dXAuYXV0aG9yaXphdGlvblVybCkge1xuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhdGxhcy1saW5rXCIgZGF0YS1hdGxhcz1cIm1mYS1kdW8tb3BlblwiIFtocmVmXT1cInNldHVwLmF1dGhvcml6YXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+e3sgdCgnbWZhLmVucm9sbER1b09wZW4nKSB9fTwvYT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyBlbnJvbC5idXN5ID8gdCgnbWZhLmVucm9sbFByZXBhcmluZycpIDogJycgfX08L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSBpZiAoZW5yb2wubWV0aG9kID09PSAndG90cCcgfHwgZW5yb2wubWV0aG9kID09PSAnaG90cCcpIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgc2V0dXApIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCI+e3sgdCgnbWZhLmVucm9sbFNjYW4nKSB9fTwvcD5cbiAgICAgICAgICAgICAgQGlmIChzZXR1cC5xckNvZGUpIHtcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXRsYXMtbWZhLXFyXCIgZGF0YS1hdGxhcz1cIm1mYS1xclwiIFtzcmNdPVwic2V0dXAucXJDb2RlXCIgW2FsdF09XCJ0KCdtZmEuZW5yb2xsUXJBbHQnKVwiIHdpZHRoPVwiMTgwXCIgaGVpZ2h0PVwiMTgwXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHVwLnNlY3JldCkge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJtZmEtc2V0dXAta2V5XCI+e3sgdCgnbWZhLmVucm9sbFNldHVwS2V5JykgfX06IDxjb2RlPnt7IHNldHVwS2V5KHNldHVwLnNlY3JldCkgfX08L2NvZGU+PC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLmVucm9sbEZpcnN0Q29kZUxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib25lLXRpbWUtY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbdmFsdWVdPVwidmFsdWVzWydjb2RlJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ2NvZGUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAoZW5yb2wubWV0aG9kID09PSAndG90cCcgJiYgZW5yb2wudG90cENvZGVzID49IDIpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLmVucm9sbFNlY29uZENvZGVMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJzZWNvbmRDb2RlXCIgYXV0b2NvbXBsZXRlPVwib25lLXRpbWUtY29kZVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbdmFsdWVdPVwidmFsdWVzWydzZWNvbmRDb2RlJ10gPz8gJydcIiAoaW5wdXQpPVwic2V0VmFsdWUoJ3NlY29uZENvZGUnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7IGVucm9sLmJ1c3kgPyB0KCdtZmEuZW5yb2xsUHJlcGFyaW5nJykgOiAnJyB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAoZW5yb2wuZW5yb2xsbWVudDsgYXMgdGV4dGVkKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXM9XCJtZmEtY29kZS10ZXh0ZWRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyB0KCdtZmEuY29kZVRleHRlZFRvJywgeyBwaG9uZTogdGV4dGVkLnBob25lID8/ICcnIH0pIH19PC9wPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ21mYS5jb2RlTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIFt2YWx1ZV09XCJ2YWx1ZXNbJ2NvZGUnXSA/PyAnJ1wiIChpbnB1dCk9XCJzZXRWYWx1ZSgnY29kZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWF0bGFzLXJlc2VuZD1cIlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgZW5yb2wuYnVzeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2VuZEVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0KCdzaWduSW4ucmVzZW5kQ29kZScpIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnbWZhLnBob25lTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiIHR5cGU9XCJ0ZWxcIiBuYW1lPVwicGhvbmVcIiBhdXRvY29tcGxldGU9XCJ0ZWxcIiBbdmFsdWVdPVwidmFsdWVzWydwaG9uZSddID8/ICcnXCIgKGlucHV0KT1cInNldFZhbHVlKCdwaG9uZScsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCI+e3sgdCgnbWZhLnBob25lSGludCcpIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAZm9yIChlcnJvciBvZiBlbnJvbC5lcnJvcnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZW5yb2wubWV0aG9kICE9PSBudWxsICYmIGVucm9sLm9wdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgQGZvciAob3RoZXIgb2Ygb3RoZXJNZXRob2RzKGVucm9sKTsgdHJhY2sgb3RoZXIpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF0bGFzLW1mYS1tZXRob2RdPVwib3RoZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8IGVucm9sLmJ1c3lcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaG9vc2VNZXRob2Qob3RoZXIpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHQob3B0aW9uS2V5KG90aGVyKSkgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGYgb2YgZmllbGRzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIEBpZiAoZi5raW5kID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdGxhcy1maWVsZFwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0KGYubGFiZWxLZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJmLnR5cGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiZi5hdXRvY29tcGxldGUgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLm5hbWVdID8/ICcnXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5uYW1lLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYubmFtZSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChmLmtpbmQgPT09ICdyZWxlYXNlZCcpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiIGRhdGEtYXRsYXMtcGFzc3dvcmQtcmVsZWFzZWQ9XCJcIj57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGYua2luZCA9PT0gJ2FsZXJ0Jykge1xuICAgICAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IHQoZi5sYWJlbEtleSkgfX08L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8cD57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoYXdhaXRpbmdQb2xpY2llcygpKSB7XG4gICAgICAgICAgPCEtLSBBIHJlcXVpcmVkIHBvbGljeSBjaGFuZ2VkOiBzY3JvbGwtbW9kZSBvbmVzIGluIHRoZWlyIGRpYWxvZywgdGhlIHJlc3QgYXMgY2hlY2tib3hlcy4gLS0+XG4gICAgICAgICAgPGF0bGFzLXBvbGljeS1hY2NlcHQtc3RlcFxuICAgICAgICAgICAgW2F0dGVtcHRdPVwiYXR0ZW1wdFwiXG4gICAgICAgICAgICBbYnVzeV09XCJidXN5XCJcbiAgICAgICAgICAgIChzdWJtaXRGbG93KT1cInN1Ym1pdEZsb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkZWNsaW5lZCk9XCJwb2xpY3lEZWNsaW5lZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgID48L2F0bGFzLXBvbGljeS1hY2NlcHQtc3RlcD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0NhcHRjaGEoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdGxhcy1jYXB0Y2hhXCIgZGF0YS1hdGxhcy1jYXB0Y2hhPVwiXCIgW2F0bGFzQ2FwdGNoYVNsb3RdPVwiY2FwdGNoYVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93U3VibWl0KCkpIHtcbiAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgW2Rpc2FibGVkXT1cImJ1c3kgfHwgKGVucm9sbGluZygpICYmICEhZW5yb2xsbWVudFN0YXRlPy5idXN5KVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgIHt7IHQoc3VibWl0S2V5KCkpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dTbXNTZWNvbmRGYWN0b3IoKSkge1xuICAgICAgICAgIEBpZiAoc21zU2Vjb25kRmFjdG9yU2VudFRvKCk7IGFzIHNlbnRUbykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cInNtcy1zZWNvbmQtZmFjdG9yLXNlbnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAge3sgdCgnbWZhLmNvZGVUZXh0ZWRUbycsIHsgcGhvbmU6IHNlbnRUbyB9KSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWF0bGFzPVwic21zLXNlY29uZC1mYWN0b3JcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhIXRleHRlZFNlY29uZEZhY3Rvcj8uYnVzeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzbXNTZWNvbmRGYWN0b3IuZW1pdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdGV4dGVkU2Vjb25kRmFjdG9yPy5idXN5ID8gdCgnc2lnbkluLnNlbmRpbmcnKSA6IHQoJ21mYS5zbXNDb2RlT3B0aW9uJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmICh0ZXh0ZWRTZWNvbmRGYWN0b3I/LmVycm9yOyBhcyBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBtZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtYWlsU2Vjb25kRmFjdG9yKCkpIHtcbiAgICAgICAgICBAaWYgKGVtYWlsU2Vjb25kRmFjdG9yU2VudFRvKCk7IGFzIHNlbnRUbykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgZGF0YS1hdGxhcz1cImVtYWlsLXNlY29uZC1mYWN0b3Itc2VudFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgICB7eyB0KCdzaWduSW4uY29kZVNlbnRUbycsIHsgZW1haWw6IHNlbnRUbyB9KSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWF0bGFzPVwiZW1haWwtc2Vjb25kLWZhY3RvclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5IHx8ICEhZW1haWxlZFNlY29uZEZhY3Rvcj8uYnVzeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJlbWFpbFNlY29uZEZhY3Rvci5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBlbWFpbGVkU2Vjb25kRmFjdG9yPy5idXN5ID8gdCgnc2lnbkluLnNlbmRpbmcnKSA6IHQoJ3NpZ25Jbi5lbWFpbENvZGVPcHRpb24nKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKGVtYWlsZWRTZWNvbmRGYWN0b3I/LmVycm9yOyBhcyBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBtZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAob2ZmZXJQYXNza2V5U2Vjb25kRmFjdG9yICYmIHN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9zZWNvbmRfZmFjdG9yJykge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1hdGxhcz1cInBhc3NrZXktc2Vjb25kLWZhY3RvclwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicGFzc2tleVNlY29uZEZhY3Rvci5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ21mYS5lbnJvbGxQYXNza2V5T3B0aW9uJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtYWlsQ29kZU9wdGlvbigpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXN0cmF0ZWd5XT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyBudWxsIDogJ2VtYWlsX2NvZGUnXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtcmVzZW5kXT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfY29kZScgPyAnJyA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUZhY3Rvci5lbWl0KCdlbWFpbF9jb2RlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQocHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9jb2RlJyA/ICdzaWduSW4ucmVzZW5kQ29kZScgOiAnc2lnbkluLnVzZUVtYWlsQ29kZScpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGhvbGRQcm9vZiA9PT0gJ2VtYWlsX2xpbmsnICYmIHN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXN0cmF0ZWd5XT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfbGluaycgPyBudWxsIDogJ2VtYWlsX2xpbmsnXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYXRsYXMtcmVzZW5kXT1cInByZXBhcmVkRmFjdG9yID09PSAnZW1haWxfbGluaycgPyAnJyA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUZhY3Rvci5lbWl0KCdlbWFpbF9saW5rJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQocHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJyA/ICdzaWduSW4ucmVzZW5kTGluaycgOiAnc2lnbkluLnVzZUVtYWlsTGluaycpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHByZXBhcmVkRmFjdG9yICYmIG9mZmVyZWQoKS5pbmNsdWRlcygncGFzc3dvcmQnKSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1zdHJhdGVneT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1c2VQYXNzd29yZC5lbWl0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5wYXNzd29yZE9wdGlvbicpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQXR0ZW1wdEZsb3dDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgQElucHV0KCkgYXR0ZW1wdDogQXR0ZW1wdFZpZXcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnVzeSA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcnM6IEZpZWxkRXJyb3JbXSA9IFtdO1xuICAvKiogYEZsb3dTdGF0ZS5zZXNzaW9uS2VwdGA6IHdoZXRoZXIgdGhpcyBicm93c2VyIGtlcHQgdGhlIHNlc3Npb24gdGhlIHNpZ24taW4gY3JlYXRlZC4gKi9cbiAgQElucHV0KCkgc2Vzc2lvbktlcHQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHRpdGxlS2V5ID0gJ3NpZ25Jbi50aXRsZSc7XG4gIC8qKiBTaWduLXVwIG9ubHk6IHRoZSBzaWduLWluIGxpbmsgYmVzaWRlIHRoZSBjb2RlIHN0ZXAncyBcImFuIGFjY291bnQgYWxyZWFkeSB1c2VzIHRoaXMgZW1haWxcIi4gKi9cbiAgQElucHV0KCkgc2lnbkluSHJlZjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgc2lnbi1pbiBjYXB0Y2hhLCBkcmF3biBhYm92ZSB0aGUgc3VibWl0IGJ1dHRvbiBvbiB0aGUgaWRlbnRpZmllciBzdGVwXG4gICAqIChhbiBhbHdheXMtb24gc2lnbi1pbiBjYXB0Y2hhKSBhbmQgb24gdGhlIGNoYWxsZW5nZSBzdGVwIHRoZSBzZXJ2ZXIgZGVtYW5kc1xuICAgKiB3aXRoIGBuZWVkc19jYXB0Y2hhYC4gTnVsbCB3aGVuIHRoZSBmbG93IGRyYXdzIG5vbmUuXG4gICAqL1xuICBASW5wdXQoKSBjYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGZhY3RvcnMgdG8gb2ZmZXIgb24gdGhlIGBuZWVkc19maXJzdF9mYWN0b3JgIHN0ZXAg4oCUIHBhc3NcbiAgICogYEF0bGFzRmxvd0NvbnRyb2xsZXIuZmlyc3RGYWN0b3JzKClgLCB3aGljaCBkcm9wcyBlbWFpbCBjb2RlIC8gbGluayB3aGlsZSB0aGVcbiAgICogYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsLiBOdWxsIHVzZXMgdGhlIHNlcnZlcidzIGxpc3QgYXMtaXMuXG4gICAqL1xuICBASW5wdXQoKSBmaXJzdEZhY3RvcnM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZmlyc3QgZmFjdG9yIGFscmVhZHkgc2VudCAoYEF0bGFzRmxvd0NvbnRyb2xsZXIucHJlcGFyZWRGYWN0b3IoKWApOiBpdHMgY29kZSBpcyBjb2xsZWN0ZWQuICovXG4gIEBJbnB1dCgpIHByZXBhcmVkRmFjdG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIGBGbG93U3RhdGUucGFzc3dvcmRIb2xkYDogd2hlcmUgdGhlIHByb29mIHdlbnQsIGFuZCB3aGV0aGVyIHRoZSBwYXNzd29yZCBzaWducyBpbiBub3cuICovXG4gIEBJbnB1dCgpIHBhc3N3b3JkSG9sZDogRmxvd1N0YXRlWydwYXNzd29yZEhvbGQnXSA9IG51bGw7XG4gIC8qKiBgQXRsYXNGbG93Q29udHJvbGxlci5ob2xkUHJvb2YoKWA6IHRoZSBlbWFpbGVkIHByb29mIGEgcGFzc3dvcmQgaG9sZCBzdGlsbCB3YWl0cyBvbi4gKi9cbiAgQElucHV0KCkgaG9sZFByb29mOiAnZW1haWxfY29kZScgfCAnZW1haWxfbGluaycgfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgdGhlIGNvbGxlY3RlZCBmaWVsZCB2YWx1ZXMgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICovXG4gIEBPdXRwdXQoKSBzdWJtaXRGbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBwaWNrcyBhIGZpcnN0IGZhY3RvciB0aGUgc2VydmVyIG11c3Qgc2VuZCBmaXJzdCAoYW4gZW1haWxlZCBjb2RlKS4gKi9cbiAgQE91dHB1dCgpIGNob29zZUZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8J2VtYWlsX2NvZGUnIHwgJ2VtYWlsX2xpbmsnPigpO1xuICAvKiogRW1pdHMgb24gXCJVc2UgeW91ciBwYXNzd29yZCBpbnN0ZWFkXCIsIGZyb20gYW4gZW1haWxlZCBmYWN0b3IgYWxyZWFkeSBzZW50LiAqL1xuICBAT3V0cHV0KCkgdXNlUGFzc3dvcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBPZmZlciBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LmVtYWlsU2Vjb25kRmFjdG9yYCk7IGBlbWFpbFNlY29uZEZhY3RvcmAgYXNrcyBmb3IgaXQgYW5kXG4gICAqIGBlbWFpbGVkU2Vjb25kRmFjdG9yYCByZXBvcnRzIGhvdyBpdCB3ZW50LlxuICAgKi9cbiAgQElucHV0KCkgb2ZmZXJFbWFpbFNlY29uZEZhY3RvciA9IGZhbHNlO1xuICAvKiogYEF0bGFzRmxvd0NvbnRyb2xsZXIuZW1haWxTZWNvbmRGYWN0b3IoKWA6IGluIGZsaWdodCwgd2hlcmUgaXQgd2VudCwgb3Igd2h5IG5vdC4gKi9cbiAgQElucHV0KCkgZW1haWxlZFNlY29uZEZhY3RvcjogeyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSBlbWFpbFNlY29uZEZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIFwiVXNlIGEgcGFzc2tleVwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yIChgbWZhQ2hvaWNlcygpLnBhc3NrZXlgKTogbGVhdmVzIGZvciB0aGUgaG9zdGVkIHBhZ2UuICovXG4gIEBJbnB1dCgpIG9mZmVyUGFzc2tleVNlY29uZEZhY3RvciA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcGFzc2tleVNlY29uZEZhY3RvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIE9mZmVyIFwiVGV4dCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh3aGVyZSB0aGUgYXBwIG9mZmVyc1xuICAgKiB0ZXh0ZWQgY29kZXMsIGBBdGxhc0Zsb3dDb250cm9sbGVyLm1mYUNob2ljZXMoKS5zbXNgKTsgYHNtc1NlY29uZEZhY3RvcmBcbiAgICogYXNrcyBmb3IgaXQgYW5kIGB0ZXh0ZWRTZWNvbmRGYWN0b3JgIHJlcG9ydHMgaG93IGl0IHdlbnQuXG4gICAqL1xuICBASW5wdXQoKSBvZmZlclNtc1NlY29uZEZhY3RvciA9IGZhbHNlO1xuICAvKiogYEF0bGFzRmxvd0NvbnRyb2xsZXIuc21zU2Vjb25kRmFjdG9yKClgOiBpbiBmbGlnaHQsIHdoZXJlIGl0IHdlbnQsIG9yIHdoeSBub3QuICovXG4gIEBJbnB1dCgpIHRleHRlZFNlY29uZEZhY3RvcjogeyBidXN5PzogYm9vbGVhbjsgc2VudFRvPzogc3RyaW5nOyBlcnJvcj86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSBzbXNTZWNvbmRGYWN0b3IgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBUaGUgTUZBIGVucm9sbWVudCBzdGVwIChgQXRsYXNGbG93Q29udHJvbGxlci5lbnJvbGxtZW50YCBhbmRcbiAgICogYGVucm9sbG1lbnRTdGF0ZSgpYCk6IHRoZSBhdXRoZW50aWNhdG9yIGFwcCdzIFFSIGNvZGUgYW5kIHNldHVwIGtleSwgb3IgYVxuICAgKiB0ZXh0ZWQgY29kZS4gTnVsbDogdGhlIHN0ZXAgYXNrcyBmb3IgdHdvIGF1dGhlbnRpY2F0b3IgY29kZXMgb25seS5cbiAgICovXG4gIEBJbnB1dCgpIGVucm9sbG1lbnQ6IE1mYUVucm9sbG1lbnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVucm9sbG1lbnRTdGF0ZTogTWZhRW5yb2xsbWVudFN0YXRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBgYWNjb3VudC5lbWFpbFZlcmlmaWNhdGlvbmAuIE9uIGBsaW5rYCBhIHNpZ24tdXAnc1xuICAgKiB2ZXJpZmljYXRpb24gc3RlcCBoYXMgbm90aGluZyB0byB0eXBlOiBpdCBzYXlzIHRvIG9wZW4gdGhlIGVtYWlsZWQgbGlua1xuICAgKiB3aGlsZSB0aGUgZmxvdyBwb2xscywgYW5kIG9mZmVycyBhIHJlc2VuZCAoYHJlc2VuZGApLlxuICAgKi9cbiAgQElucHV0KCkgZW1haWxWZXJpZmljYXRpb246IHN0cmluZyA9ICdjb2RlJztcbiAgLyoqIGBGbG93U3RhdGUubWF0Y2hDb2RlYDogc2hvd24gd2hpbGUgYSBtYWlsZWQgbGluayB3YWl0cywgdG8gdHlwZSBpZiBpdCdzIG9wZW5lZCBvbiBhbm90aGVyIGRldmljZS4gKi9cbiAgQElucHV0KCkgbWF0Y2hDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIHJlc2VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIFRoZSB1c2VyIGRlY2xpbmVkIGEgcG9saWN5IHRoZSBzaWduLWluIHdhcyB3YWl0aW5nIG9uIChgbmVlZHNfcG9saWN5X2FjY2VwdGFuY2VgKTogY2FuY2VsIHRoZSBhdHRlbXB0LiAqL1xuICBAT3V0cHV0KCkgcG9saWN5RGVjbGluZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgLyoqIEEgc2VydmVyIGVycm9yIGluIHRoZSBhcHAncyBsYW5ndWFnZSAoYGVycm9yLjxyZWFzb24+YCwgZWxzZSB0aGUgc2VydmVyJ3MgbWVzc2FnZSkuICovXG4gIHByb3RlY3RlZCBlcnJvclRleHQoZXJyb3I6IEZpZWxkRXJyb3IpOiBzdHJpbmcge1xuICAgIC8vIGBlcnJvckxvY2FsaXphdGlvbmAgaXMgcmVhZCBkZWZlbnNpdmVseTogYSBzdGFuZC1pbiBzZXJ2aWNlIG1heSBsYWNrIGl0LlxuICAgIGNvbnN0IGxheWVyID0gKHRoaXMuYXRsYXMgYXMgeyBlcnJvckxvY2FsaXphdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkuZXJyb3JMb2NhbGl6YXRpb247XG4gICAgcmV0dXJuIGxvY2FsaXplZEVycm9yTWVzc2FnZShlcnJvciwgbGF5ZXIgPz8gdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIHRoaXMuYXRsYXMubG9jYWxpemF0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbHMoa2V5OiBFbGVtZW50S2V5LCBiYXNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbGFzc0ZvcihrZXksIHRoaXMuYXRsYXMuYXBwZWFyYW5jZSwgYmFzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB7IC4uLnRoaXMudmFsdWVzLCBbbmFtZV06IHZhbHVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdWJtaXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBFbnJvbG1lbnQ6IHRleHQgdGhlIGNvZGUgdG8gdGhlIHR5cGVkIG51bWJlciwgb3IgY29uZmlybSB0aGUgZmFjdG9yLlxuICAgIGlmICh0aGlzLmVucm9sbGluZygpICYmIHRoaXMuZW5yb2xsbWVudCkge1xuICAgICAgdm9pZCB0aGlzLmVucm9sbG1lbnQuc3VibWl0KHRoaXMudmFsdWVzKS50aGVuKChuZXh0KSA9PiB7XG4gICAgICAgIGlmIChuZXh0KSB0aGlzLnN1Ym1pdEZsb3cuZW1pdChuZXh0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBPbmx5IHdoYXQgaXMgb24gc2NyZWVuOiBhIGNvZGUgdHlwZWQgZWFybGllciBtdXN0IG5vdCB0dXJuIGEgcGFzc3dvcmQgaW50byBhIGNvZGUgYXR0ZW1wdC5cbiAgICBpZiAodGhpcy5zdGVwKCkua2luZCA9PT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykge1xuICAgICAgdGhpcy5zdWJtaXRGbG93LmVtaXQodGhpcy5wcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnID8geyBjb2RlOiB0aGlzLnZhbHVlc1snY29kZSddID8/ICcnIH0gOiB7IHBhc3N3b3JkOiB0aGlzLnZhbHVlc1sncGFzc3dvcmQnXSA/PyAnJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdWJtaXRGbG93LmVtaXQodGhpcy52YWx1ZXMpO1xuICB9XG5cbiAgLyoqIFRoZSBzaGFyZWQgZW5yb2xtZW50IHN0ZXAgaXMgZHJhd24gKGEgY29udHJvbGxlciB3YXMgcGFzc2VkIGFuZCB0aGUgZmxvdyBpcyBlbnJvbGxpbmcpLiAqL1xuICBwcm90ZWN0ZWQgZW5yb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnZW5yb2xsX3NlY29uZF9mYWN0b3InICYmICEhdGhpcy5lbnJvbGxtZW50ICYmICEhdGhpcy5lbnJvbGxtZW50U3RhdGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hvb3NlTWV0aG9kKG1ldGhvZDogTWZhRW5yb2xsbWVudFN0cmF0ZWd5KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB2b2lkIHRoaXMuZW5yb2xsbWVudD8uY2hvb3NlKG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZW5kRW5yb2xsbWVudCgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZW5yb2xsbWVudD8ucmVzZW5kKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3B0aW9uS2V5KG1ldGhvZDogTWZhRW5yb2xsbWVudFN0cmF0ZWd5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5yb2xsbWVudE9wdGlvbktleShtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dNYXRjaENvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5tYXRjaENvZGUgJiYgKHRoaXMuc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X2VtYWlsX2NvZGUnIHx8IHRoaXMubGlua1NlbnRUZXh0KCkgIT09IG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG90aGVyTWV0aG9kcyhzdGF0ZTogTWZhRW5yb2xsbWVudFN0YXRlKTogTWZhRW5yb2xsbWVudFN0cmF0ZWd5W10ge1xuICAgIHJldHVybiBzdGF0ZS5vcHRpb25zLmZpbHRlcigobSkgPT4gbSAhPT0gc3RhdGUubWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEtleShzZWNyZXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdyb3VwU2V0dXBLZXkoc2VjcmV0KTtcbiAgfVxuXG4gIC8qKiBUaGUgc3VibWl0IGJ1dHRvbidzIGxhYmVsIGtleSAoZW5yb2xtZW50OiBcIlRleHQgbWUgYSBjb2RlXCIgYmVmb3JlIHRoZSBudW1iZXIgaXMgc2VudCkuICovXG4gIHByb3RlY3RlZCBzdWJtaXRLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50U3RhdGUgJiYgZW5yb2xsbWVudFN1Ym1pdEtleSh0aGlzLmVucm9sbG1lbnRTdGF0ZSkpIHx8ICdzaWduSW4uc3VibWl0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U21zU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyU21zU2Vjb25kRmFjdG9yICYmIHRoaXMuc3RlcCgpLmtpbmQgPT09ICdjb2xsZWN0X3NlY29uZF9mYWN0b3InO1xuICB9XG5cbiAgLyoqIFdoZXJlIHRoZSB0ZXh0ZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBzbXNTZWNvbmRGYWN0b3JTZW50VG8oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VudCA9IHRoaXMudGV4dGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtRXJyb3JzKCk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+ICFlcnJvci5wYXJhbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2lnbkluTGluayhlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnY29sbGVjdF9lbWFpbF9jb2RlJyAmJiBlcnJvci5jb2RlID09PSAnSURFTlRJRklFUl9FWElTVFMnICYmIGVycm9yLm1ldGE/LlsnaWRlbnRpZmllciddICE9PSAndXNlcm5hbWUnID8gdGhpcy5zaWduSW5IcmVmIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWVsZEVycm9yc0ZvcihuYW1lOiBzdHJpbmcpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXJhbSA9PT0gbmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRlbXB0ID8gbmV4dFN0ZXAodGhpcy5hdHRlbXB0KSA6ICh7IGtpbmQ6ICdjb2xsZWN0X2lkZW50aWZpZXInIH0gYXMgY29uc3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dDYXB0Y2hhKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLnN0ZXAoKS5raW5kO1xuICAgIHJldHVybiAhIXRoaXMuY2FwdGNoYSAmJiAoa2luZCA9PT0gJ2NvbGxlY3RfaWRlbnRpZmllcicgfHwga2luZCA9PT0gJ2NvbGxlY3RfY2FwdGNoYScpO1xuICB9XG5cbiAgLyoqIFRoZSBmaXJzdCBmYWN0b3JzIG9uIG9mZmVyIGF0IGEgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcCAoZW1wdHkgb24gYW55IG90aGVyKS4gKi9cbiAgcHJvdGVjdGVkIG9mZmVyZWQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAoKTtcbiAgICBpZiAoc3RlcC5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RGYWN0b3JzID8/IHN0ZXAuc3RyYXRlZ2llcztcbiAgfVxuXG4gIHByb3RlY3RlZCBsaW5rT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXdhaXRpbmdTaWduVXBMaW5rKHRoaXMuYXR0ZW1wdCwgdGhpcy5lbWFpbFZlcmlmaWNhdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0VtYWlsU2Vjb25kRmFjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9mZmVyRW1haWxTZWNvbmRGYWN0b3IgJiYgdGhpcy5zdGVwKCkua2luZCA9PT0gJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGVtYWlsZWQgc2Vjb25kLWZhY3RvciBjb2RlIHdlbnQgKG1hc2tlZCksIG9uY2UgaXQgd2FzIHNlbnQuICovXG4gIHByb3RlY3RlZCBlbWFpbFNlY29uZEZhY3RvclNlbnRUbygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZW50ID0gdGhpcy5lbWFpbGVkU2Vjb25kRmFjdG9yPy5zZW50VG87XG4gICAgcmV0dXJuIHR5cGVvZiBzZW50ID09PSAnc3RyaW5nJyA/IHNlbnQgfHwgJyAnIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RW1haWxDb2RlT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIEJlZm9yZSB0aGUgY29kZSBpcyBzZW50OiB0aGUgY2hvaWNlIChvciB0aGUgcmV0cnkgb2YgYSBmYWlsZWQgYXV0b21hdGljXG4gICAgLy8gc2VuZCkuIEFmdGVyOiBcIlJlc2VuZCBjb2RlXCIuXG4gICAgcmV0dXJuIHRoaXMub2ZmZXJlZCgpLmluY2x1ZGVzKCdlbWFpbF9jb2RlJyk7XG4gIH1cblxuICAvKiogVGhlIFwid2Ugc2VudCBhIGNvZGUgdG8g4oCmXCIgbGluZSBvbiB0aGUgY29kZSBzdGVwLiAqL1xuICBwcm90ZWN0ZWQgY29kZVNlbnRUZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IgIT09ICdlbWFpbF9jb2RlJykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudCgnc2lnbkluLmNvZGVTZW50VG8nLCB7IGVtYWlsOiB0aGlzLnBhc3N3b3JkSG9sZD8uZW1haWwgPz8gdGhpcy5hdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBcIndlIHNlbnQgYSBsaW5rIHRvIOKAplwiIGxpbmUsIG9uY2UgYSBsaW5rIHdhcyBzZW50LiAqL1xuICBwcm90ZWN0ZWQgbGlua1NlbnRUZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnN0ZXAoKS5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InIHx8IHRoaXMucHJlcGFyZWRGYWN0b3IgIT09ICdlbWFpbF9saW5rJykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudCgnc2lnbkluLmxpbmtTZW50VG8nLCB7IGVtYWlsOiB0aGlzLnBhc3N3b3JkSG9sZD8uZW1haWwgPz8gdGhpcy5hdHRlbXB0Py5pZGVudGlmaWVyID8/ICcnIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGlzIGBuZWVkc19wb2xpY3lfYWNjZXB0YW5jZWAuICovXG4gIHByb3RlY3RlZCBhd2FpdGluZ1BvbGljaWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXAoKS5raW5kID09PSAnYWNjZXB0X3BvbGljaWVzJztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLnN0ZXAoKS5raW5kO1xuICAgIC8vIE5vdGhpbmcgdG8gc3VibWl0IG9uIGEgZmlyc3QtZmFjdG9yIHN0ZXAgdGhhdCBvbmx5IG9mZmVycyBhbiBlbWFpbGVkIGNvZGVcbiAgICAvLyB1bnRpbCB0aGF0IGNvZGUgaXMgc2VudC5cbiAgICBpZiAoa2luZCA9PT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykgcmV0dXJuIHRoaXMuZmllbGRzKCkuc29tZSgoZikgPT4gZi5raW5kID09PSAnaW5wdXQnKTtcbiAgICBpZiAodGhpcy5saW5rT25seSgpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRW5yb2xtZW50OiBub3RoaW5nIHRvIHN1Ym1pdCB3aGlsZSBjaG9vc2luZyBhIG1ldGhvZCBvciBmZXRjaGluZyB0aGUgc2V0dXAuXG4gICAgaWYgKHRoaXMuZW5yb2xsaW5nKCkgJiYgdGhpcy5lbnJvbGxtZW50U3RhdGUgJiYgIWVucm9sbG1lbnRTdWJtaXRLZXkodGhpcy5lbnJvbGxtZW50U3RhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtpbmQgIT09ICdkb25lJyAmJiBraW5kICE9PSAnYXdhaXRfb2F1dGgnICYmIGtpbmQgIT09ICdhY2NlcHRfcG9saWNpZXMnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkcygpOiBTdGVwRmllbGRbXSB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCgpO1xuICAgIHN3aXRjaCAoc3RlcC5raW5kKSB7XG4gICAgICBjYXNlICdjb2xsZWN0X2lkZW50aWZpZXInOlxuICAgICAgICAvLyBgd2ViYXV0aG5gOiBzYXZlZCBwYXNza2V5cyBhcHBlYXIgaW4gdGhpcyBmaWVsZCdzIGF1dG9maWxsIHdoaWxlIDxhdGxhcy1zaWduLWluPiBob2xkcyBhIGNvbmRpdGlvbmFsIHJlcXVlc3QuXG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnaWRlbnRpZmllcicsIGxhYmVsS2V5OiAnc2lnbkluLmlkZW50aWZpZXJMYWJlbCcsIHR5cGU6ICdlbWFpbCcsIGF1dG9jb21wbGV0ZTogJ3VzZXJuYW1lIHdlYmF1dGhuJyB9XTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJzoge1xuICAgICAgICBpZiAodGhpcy5wcmVwYXJlZEZhY3RvciA9PT0gJ2VtYWlsX2NvZGUnKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdzaWduSW4uZW1haWxDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9saW5rJykgcmV0dXJuIFtdO1xuICAgICAgICAvLyBUaGUgcGFzc3dvcmQgZmllbGQgdW5sZXNzIHRoZSBvbmx5IG9mZmVyIGlzIGFuIGVtYWlsZWQgY29kZSAoY2hvc2VuXG4gICAgICAgIC8vIHdpdGggdGhlIGJ1dHRvbiBiZWxvdyB0aGUgZm9ybSkuXG4gICAgICAgIGNvbnN0IG9mZmVyZWQgPSB0aGlzLm9mZmVyZWQoKTtcbiAgICAgICAgcmV0dXJuIG9mZmVyZWQuaW5jbHVkZXMoJ2VtYWlsX2NvZGUnKSAmJiAhb2ZmZXJlZC5pbmNsdWRlcygncGFzc3dvcmQnKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgLi4uKHRoaXMucGFzc3dvcmRIb2xkPy5yZWxlYXNlZCA/IFtyZWxlYXNlZCgpXSA6IFtdKSxcbiAgICAgICAgICAgICAgeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3NpZ25Jbi5wYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9LFxuICAgICAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnbWZhLmNvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgIGNhc2UgJ2Vucm9sbF9zZWNvbmRfZmFjdG9yJzpcbiAgICAgICAgLy8gVGhlIHNoYXJlZCBlbnJvbG1lbnQgc3RlcCBkcmF3cyBpdHMgb3duIGZpZWxkcyAoYWJvdmUpLlxuICAgICAgICBpZiAodGhpcy5lbnJvbGxpbmcoKSkgcmV0dXJuIFtdO1xuICAgICAgICAvLyBUd28gY29uc2VjdXRpdmUgY29kZXMgKMKnNS42KTogYSBwaG9uZSB3aXRoIGEgZmFzdCBjbG9jayBmYWlscyBoZXJlXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIG9uIGV2ZXJ5IHNpZ24taW4gYWZ0ZXJ3YXJkcy5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdtZmEuZW5yb2xsRmlyc3RDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgICB7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdzZWNvbmRDb2RlJywgbGFiZWxLZXk6ICdtZmEuZW5yb2xsU2Vjb25kQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIF07XG4gICAgICBjYXNlICdjb2xsZWN0X2VtYWlsX2NvZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5saW5rT25seSgpID8gW10gOiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnc2lnbkluLmVtYWlsQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9uZXdfcGFzc3dvcmQnOlxuICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ3Bhc3N3b3JkJywgbGFiZWxLZXk6ICdyZXNldC5uZXdQYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9XTtcbiAgICAgIGNhc2UgJ2FjY2VwdF9wb2xpY2llcyc6XG4gICAgICAgIC8vIERyYXduIGJ5IDxhdGxhcy1wb2xpY3ktYWNjZXB0LXN0ZXA+IGFib3ZlLlxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlICdjb2xsZWN0X2NhcHRjaGEnOlxuICAgICAgICAvLyDCpzUgdGhlIHNlcnZlciB3aXRoaGVsZCB0aGUgYXR0ZW1wdCB1bnRpbCBhIGNhcHRjaGEgY2xlYXJzLiBTb2x2aW5nIHRoZVxuICAgICAgICAvLyB3aWRnZXQgcmVzdWJtaXRzIHRoZSBpZGVudGlmaWVyIG9uIGl0cyBvd247IHRoZSBidXR0b24gcmV0cmllcy5cbiAgICAgICAgcmV0dXJuIFttc2coJ2NhcHRjaGEucHJvbXB0JyldO1xuICAgICAgY2FzZSAnYXdhaXRfb2F1dGgnOlxuICAgICAgICByZXR1cm4gW21zZygnc2lnbkluLm1hZ2ljTGlua1NlbnQnKV07XG4gICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgLy8gU2lnbmVkIGluIG9ubHkgd2hlbiB0aGlzIGJyb3dzZXIgaG9sZHMgdGhlIHNlc3Npb247IGEgYmxvY2tlZCBjb29raWUgaXMgc2FpZFxuICAgICAgICAvLyBwbGFpbmx5LiBcIkNoZWNrIHRoZSBvdGhlciB0YWJcIiBpcyBmb3IgYSBzaWduLWluIGNvbXBsZXRlZCBvbiBhbm90aGVyIGRldmljZS5cbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbktlcHQgPT09IHRydWUpIHJldHVybiBbbXNnKCdzaWduSW4uc2lnbmVkSW4nKV07XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25LZXB0ID09PSBmYWxzZSkgcmV0dXJuIFt7IGtpbmQ6ICdhbGVydCcsIG5hbWU6ICcnLCBsYWJlbEtleTogJ3NpZ25Jbi5zZXNzaW9uTm90S2VwdCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgICAgcmV0dXJuIFttc2coJ3NpZ25Jbi5jaGVja090aGVyVGFiJyldO1xuICAgICAgY2FzZSAncmVzdGFydCc6XG4gICAgICAgIHJldHVybiBbbXNnKCdlcnJvci5nZW5lcmljJyldO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQSBzdGF0dXMgdGhpcyBTREsgdmVyc2lvbiBkb2VzIG5vdCBrbm93LiBBbiBob25lc3QgbWVzc2FnZSBiZWF0cyBhXG4gICAgICAgIC8vIGJsYW5rIGxvZ2luIGJveCB0aGUgdXNlciBjYW5ub3QgYWN0IG9uLlxuICAgICAgICByZXR1cm4gW21zZygnZXJyb3IuZ2VuZXJpYycpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEEgcmVhZC1vbmx5IG1lc3NhZ2Ugcm93OiBgbGFiZWxLZXlgIGhvbGRzIHRoZSBpMThuIGtleSBvZiB0aGUgdGV4dCB0byBzaG93LiAqL1xuZnVuY3Rpb24gbXNnKGxhYmVsS2V5OiBzdHJpbmcpOiBTdGVwRmllbGQge1xuICByZXR1cm4geyBraW5kOiAnbWVzc2FnZScsIG5hbWU6ICcnLCBsYWJlbEtleSwgdHlwZTogJ3RleHQnIH07XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VkKCk6IFN0ZXBGaWVsZCB7XG4gIHJldHVybiB7IGtpbmQ6ICdyZWxlYXNlZCcsIG5hbWU6ICcnLCBsYWJlbEtleTogJ3NpZ25Jbi5wYXNzd29yZEhvbGRSZWxlYXNlZCcsIHR5cGU6ICd0ZXh0JyB9O1xufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { signal } from '@angular/core';
|
|
2
|
-
import { advanceWithCaptcha, atlasCaptchaLabels, attemptPasswordHoldProof, preparePasswordHoldProof, createCaptchaController, createPasskeySignInController, createPasskeySignUp, createSignUp, finishPasskeySignUp, fetchInstanceSettings, fetchLastSignInMethod, startSignInWithAtlas, createMfaEnrollment, acknowledgeExistingAccount, acknowledgeRecoveryCodes, pendingExistingAccountNotice, pendingRecoveryCodes, mfaChoicesFrom, prepareSecondFactorCode, resendSignUpVerification, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, PolicyAcceptanceController, loadPolicies, } from '@atlasauth/js';
|
|
2
|
+
import { advanceWithCaptcha, atlasCaptchaLabels, attemptPasswordHoldProof, preparePasswordHoldProof, createCaptchaController, createPasskeySignInController, createPasskeySignUp, createSignUp, finishPasskeySignUp, fetchInstanceSettings, fetchLastSignInMethod, startSignInWithAtlas, createMfaEnrollment, acknowledgeExistingAccount, acknowledgeRecoveryCodes, pendingExistingAccountNotice, pendingRecoveryCodes, mfaChoicesFrom, prepareSecondFactorCode, sendOnlyWaySecondFactorCode, continueOnHostedPage, resendSignUpVerification, flowNeedsCaptcha, signInCaptchaOptions, flowFromPending, initialFlow, nextStep, offeredFirstFactors, pollAttempt, prepareFactor, planFirstFactor, shouldKeepPolling, PolicyAcceptanceController, loadPolicies, } from '@atlasauth/js';
|
|
3
3
|
import { EN_US, translate } from '../i18n';
|
|
4
4
|
/**
|
|
5
5
|
* The server-driven sign-in / sign-up engine, shared by `<atlas-sign-in>` and
|
|
@@ -239,8 +239,28 @@ export class AtlasFlowController {
|
|
|
239
239
|
this.syncCaptcha();
|
|
240
240
|
this.syncEnrollment();
|
|
241
241
|
this.autoSend();
|
|
242
|
+
this.autoSendOnlyWay();
|
|
242
243
|
}
|
|
243
244
|
autoSentFor = null;
|
|
245
|
+
onlyWayFor = null;
|
|
246
|
+
/** Once per attempt, on arrival at the second factor: email the code if the inbox is the only way. */
|
|
247
|
+
autoSendOnlyWay() {
|
|
248
|
+
const { attempt } = this.state();
|
|
249
|
+
const id = attempt?.id ?? null;
|
|
250
|
+
if (!id || attempt?.status !== 'needs_second_factor' || this.onlyWayFor === id || !this.mfaChoices().emailCode)
|
|
251
|
+
return;
|
|
252
|
+
this.onlyWayFor = id;
|
|
253
|
+
void sendOnlyWaySecondFactorCode(this.client, id).then((sentTo) => {
|
|
254
|
+
// A stale answer (the flow moved to another attempt) is dropped.
|
|
255
|
+
if (sentTo && this.state().attempt?.id === id)
|
|
256
|
+
this.emailSecondFactor.set({ sentTo });
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/** "Use a passkey" at the second factor: leaves for the hosted page. */
|
|
260
|
+
continueWithPasskey() {
|
|
261
|
+
const id = this.state().attempt?.id;
|
|
262
|
+
return !!id && continueOnHostedPage(this.mfaChoices(), id, 'needs_second_factor');
|
|
263
|
+
}
|
|
244
264
|
/**
|
|
245
265
|
* With no password on offer, email the code as soon as the server asks for a
|
|
246
266
|
* first factor — once per attempt, so a failed send waits for the user's retry
|
|
@@ -458,4 +478,4 @@ export class AtlasFlowController {
|
|
|
458
478
|
this.signUpCaptcha.destroy();
|
|
459
479
|
}
|
|
460
480
|
}
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsNEJBQTRCLEVBQzVCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLFlBQVksR0FRYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQStEWDtJQUNBO0lBR0E7SUFFQTtJQXBFVixLQUFLLENBQTRCO0lBQzFDOzs7O09BSUc7SUFDTSxRQUFRLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMxRDs7O09BR0c7SUFDTSxVQUFVLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUNsRCx5RUFBeUU7SUFDaEUsT0FBTyxHQUFzQix1QkFBdUIsQ0FBQyxTQUFTLEVBQUU7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QztZQUNuQixhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLE9BQU87UUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRmFwaUNsaWVudCxcbiAgYWR2YW5jZVdpdGhDYXB0Y2hhLFxuICBhdGxhc0NhcHRjaGFMYWJlbHMsXG4gIGF0dGVtcHRQYXNzd29yZEhvbGRQcm9vZixcbiAgcHJlcGFyZVBhc3N3b3JkSG9sZFByb29mLFxuICBjcmVhdGVDYXB0Y2hhQ29udHJvbGxlcixcbiAgY3JlYXRlUGFzc2tleVNpZ25JbkNvbnRyb2xsZXIsXG4gIGNyZWF0ZVBhc3NrZXlTaWduVXAsXG4gIGNyZWF0ZVNpZ25VcCxcbiAgZmluaXNoUGFzc2tleVNpZ25VcCxcbiAgZmV0Y2hJbnN0YW5jZVNldHRpbmdzLFxuICBmZXRjaExhc3RTaWduSW5NZXRob2QsXG4gIHN0YXJ0U2lnbkluV2l0aEF0bGFzLFxuICBjcmVhdGVNZmFFbnJvbGxtZW50LFxuICBhY2tub3dsZWRnZUV4aXN0aW5nQWNjb3VudCxcbiAgYWNrbm93bGVkZ2VSZWNvdmVyeUNvZGVzLFxuICBwZW5kaW5nRXhpc3RpbmdBY2NvdW50Tm90aWNlLFxuICBwZW5kaW5nUmVjb3ZlcnlDb2RlcyxcbiAgbWZhQ2hvaWNlc0Zyb20sXG4gIHByZXBhcmVTZWNvbmRGYWN0b3JDb2RlLFxuICByZXNlbmRTaWduVXBWZXJpZmljYXRpb24sXG4gIGZsb3dOZWVkc0NhcHRjaGEsXG4gIHNpZ25JbkNhcHRjaGFPcHRpb25zLFxuICBmbG93RnJvbVBlbmRpbmcsXG4gIGluaXRpYWxGbG93LFxuICBuZXh0U3RlcCxcbiAgb2ZmZXJlZEZpcnN0RmFjdG9ycyxcbiAgcG9sbEF0dGVtcHQsXG4gIHByZXBhcmVGYWN0b3IsXG4gIHBsYW5GaXJzdEZhY3RvcixcbiAgc2hvdWxkS2VlcFBvbGxpbmcsXG4gIFBvbGljeUFjY2VwdGFuY2VDb250cm9sbGVyLFxuICBsb2FkUG9saWNpZXMsXG4gIHR5cGUgQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIHR5cGUgRmxvd1N0YXRlLFxuICB0eXBlIEluc3RhbmNlU2V0dGluZ3MsXG4gIHR5cGUgTWZhQ2hvaWNlcyxcbiAgdHlwZSBNZmFFbnJvbGxtZW50Q29udHJvbGxlcixcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RhdGUsXG4gIHR5cGUgUGFzc2tleVNpZ25JbkNvbnRyb2xsZXIsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgRU5fVVMsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuXG4vKipcbiAqIFRoZSBzZXJ2ZXItZHJpdmVuIHNpZ24taW4gLyBzaWduLXVwIGVuZ2luZSwgc2hhcmVkIGJ5IGA8YXRsYXMtc2lnbi1pbj5gIGFuZFxuICogYDxhdGxhcy1zaWduLXVwPmAg4oCUIHRoZSBBbmd1bGFyIGNvdW50ZXJwYXJ0IG9mIFJlYWN0J3MgYHVzZUZsb3dgIGhvb2suXG4gKlxuICogSXQgb3ducyBubyBkZWNpc2lvbiBhYm91dCB3aGF0IGNvbWVzIG5leHQ6IGV2ZXJ5IHN0YXR1cyBjb21lcyBiYWNrIGZyb20gdGhlXG4gKiBzZXJ2ZXIgdmlhIGBhZHZhbmNlYCwgYW5kIHRoaXMgY29udHJvbGxlciBvbmx5IHBvc3RzIHdoYXRldmVyIHRoZSBjdXJyZW50IHN0ZXBcbiAqIG5lZWRzIGFuZCByZS1yZW5kZXJzIHRoZSByZXR1cm5lZCBzdGF0dXMuIFN0YXRlIGxpdmVzIGluIGEgc2lnbmFsIHNvIHRlbXBsYXRlc1xuICogdXBkYXRlIHdoZXRoZXIgdGhlIGFwcCBydW5zIHpvbmVkIG9yIHpvbmVsZXNzLlxuICpcbiAqIGA8YXRsYXMtc2lnbi11cD5gIHN0YXJ0cyB0aGUgYXR0ZW1wdCB3aXRoIHtAbGluayBjcmVhdGV9XG4gKiAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwc2ApOyB0aGUgZW1haWxlZC1jb2RlIHN0ZXAgdGhlbiBydW5zIHRocm91Z2ggdGhlIHNhbWVcbiAqIHtAbGluayBzdWJtaXR9LiBCb3RoIGZsb3dzIGRyYXcgdGhlIGluc3RhbmNlJ3MgY2FwdGNoYSAoZnJvbVxuICoge0BsaW5rIGxvYWRTZXR0aW5nc30pIHdoZW4gaXQgaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGxhc0Zsb3dDb250cm9sbGVyIHtcbiAgcmVhZG9ubHkgc3RhdGU6IFdyaXRhYmxlU2lnbmFsPEZsb3dTdGF0ZT47XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBwdWJsaWMgc2lnbi1pbiAvIHNpZ24tdXAgc2V0dGluZ3MgKGNhcHRjaGEsIHNpZ24tdXAgZmllbGRzLFxuICAgKiBsZWdhbCBjb25zZW50KSBmcm9tIGBHRVQgL3YxL2FwcGVhcmFuY2VgOyBudWxsIHVudGlsIHtAbGluayBsb2FkU2V0dGluZ3N9XG4gICAqIHJlc29sdmVzLCBvciB3aGVuIHRoZSBzZXJ2ZXIgY291bGQgbm90IGJlIHJlYWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5ncyA9IHNpZ25hbDxJbnN0YW5jZVNldHRpbmdzIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIHRoaXMgYnJvd3NlciBsYXN0IHNpZ25lZCBpbiB3aXRoIChgcGFzc3dvcmRgLCBgb2F1dGhfZ2l0aHViYCwg4oCmKVxuICAgKiBmb3IgdGhlIFwiTGFzdCB1c2VkXCIgaGludDsgbnVsbCB3aGVuIG5vbmUsIG9yIHRoZSBpbnN0YW5jZSB0dXJuZWQgaXQgb2ZmLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdE1ldGhvZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgLyoqIFRoZSBzaWduLWluIGNhcHRjaGEgKGlkZW50aWZpZXIgc3RlcCAvIGBuZWVkc19jYXB0Y2hhYCBjaGFsbGVuZ2UpLiAqL1xuICByZWFkb25seSBjYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciA9IGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyKHVuZGVmaW5lZCwge1xuICAgIC8vIFRoZSBBdGxhcyBjYXB0Y2hhJ3Mgd29yZHMgZm9sbG93IHRoZSBmb3JtJ3MgY2F0YWxvZyAocmVhZCB3aGVuIGRyYXduKS5cbiAgICBhdGxhc0xhYmVsczogKCkgPT4gYXRsYXNDYXB0Y2hhTGFiZWxzKHRoaXMudCksXG4gIH0pO1xuICAvKiogVGhlIHNpZ24tdXAgY2FwdGNoYSAodGhlIGNyZWF0ZS1hY2NvdW50IHN0ZXApLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciA9IGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyKHVuZGVmaW5lZCwge1xuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBjYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBjYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKiogV2hldGhlciB7QGxpbmsgc2lnblVwQ2FwdGNoYX0gY3VycmVudGx5IGRyYXdzIGEgd2lkZ2V0IChmb3IgdGVtcGxhdGVzKS4gKi9cbiAgcmVhZG9ubHkgc2lnblVwQ2FwdGNoYURyYXduID0gc2lnbmFsKGZhbHNlKTtcbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3IgdGhlIHNlcnZlciB3YXMgYXNrZWQgdG8gc2VuZCAoe0BsaW5rIHByZXBhcmV9KSBvbiB0aGVcbiAgICogY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIOKAlCB0aGUgZm9ybSB0aGVuIGNvbGxlY3RzIGl0cyBjb2RlLiBOdWxsXG4gICAqIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZXBhcmVkRmFjdG9yID0gc2lnbmFsPCdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyB8IG51bGw+KG51bGwpO1xuICAvKipcbiAgICogXCJFbWFpbCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh7QGxpbmsgc2VuZEVtYWlsU2Vjb25kRmFjdG9yfSk6XG4gICAqIGluIGZsaWdodCwgd2hlcmUgdGhlIGNvZGUgd2VudCwgb3Igd2h5IGl0IHdhcyBub3Qgc2VudC4gTnVsbCB1bnRpbCBhc2tlZCxcbiAgICogYW5kIGFnYWluIG9uY2UgdGhlIGZsb3cgbGVhdmVzIHRoYXQgc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsU2Vjb25kRmFjdG9yID0gc2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICAvKiogXCJUZXh0IG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHtAbGluayBzZW5kU21zU2Vjb25kRmFjdG9yfSk6IGFzIHtAbGluayBlbWFpbFNlY29uZEZhY3Rvcn0uICovXG4gIHJlYWRvbmx5IHNtc1NlY29uZEZhY3RvciA9IHNpZ25hbDx7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsPihudWxsKTtcbiAgLyoqXG4gICAqIFRoZSBNRkEgZW5yb2xtZW50IHN0ZXAgKGBuZWVkc19tZmFfZW5yb2xsbWVudGApOiB0aGUgYXV0aGVudGljYXRvciBhcHAnc1xuICAgKiBzZXR1cCAoUVIgY29kZSwgc2V0dXAga2V5KSBvciBhIHRleHRlZCBjb2RlLiBTdGFydGVkIGFuZCByZXNldCB3aXRoIHRoZSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudENvbnRyb2xsZXI7XG4gIC8qKiB7QGxpbmsgZW5yb2xsbWVudH0ncyBzdGF0ZSwgZm9yIHRlbXBsYXRlcy4gKi9cbiAgcmVhZG9ubHkgZW5yb2xsbWVudFN0YXRlOiBXcml0YWJsZVNpZ25hbDxNZmFFbnJvbGxtZW50U3RhdGU+O1xuICAvKipcbiAgICogVGhlIGluc3RhbmNlJ3MgcG9saWNpZXMgKHRlcm1zLCBwcml2YWN5LCDigKYpIGZvciB0aGUgY3JlYXRlLWFjY291bnQgZm9ybTpcbiAgICoge0BsaW5rIGNyZWF0ZX0gc2VuZHMgdGhlaXIgYWNjZXB0YW5jZXMgYW5kIHJlbG9hZHMgdGhlbSBhZnRlciBhIHJlZnVzYWwuXG4gICAqL1xuICByZWFkb25seSBwb2xpY2llcyA9IG5ldyBQb2xpY3lBY2NlcHRhbmNlQ29udHJvbGxlcihbXSk7XG4gIC8qKlxuICAgKiBQYXNza2V5IHNpZ24taW4gKHRoZSBcIlNpZ24gaW4gd2l0aCBhIHBhc3NrZXlcIiBidXR0b24gYW5kIHBhc3NrZXkgYXV0b2ZpbGwgb25cbiAgICogdGhlIGlkZW50aWZpZXIgZmllbGQpLiBUaGUgb3V0Y29tZSBnb2VzIHRocm91Z2ggdGhlIHNhbWUgY29tcGxldGlvbiBhcyBldmVyeSBzaWduLWluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc2tleTogUGFzc2tleVNpZ25JbkNvbnRyb2xsZXI7XG4gIC8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBjYW4gcnVuIFdlYkF1dGhuOyBgPGF0bGFzLXNpZ24taW4+YCBzZXRzIGl0IGFmdGVyIGl0IGlzIGNyZWF0ZWQgaW4gYSBicm93c2VyLiAqL1xuICByZWFkb25seSBwYXNza2V5U3VwcG9ydGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlkZW50aWZpZXIgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRmFwaUNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbG9hZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICBwZW5kaW5nOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsLFxuICAgIC8qKiBSZXNvbHZlcyB0aGUgY2FwdGNoYSBtZXNzYWdlcycgY2F0YWxvZyBrZXlzLiBEZWZhdWx0cyB0byBlbi1VUy4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHQ6IChrZXk6IHN0cmluZykgPT4gc3RyaW5nID0gKGtleSkgPT4gdHJhbnNsYXRlKEVOX1VTLCBrZXkpLFxuICAgIC8qKiBXYWl0IGZvciB7QGxpbmsgY29udGludWVBZnRlckV4aXN0aW5nQWNjb3VudH0gKGA8YXRsYXMtc2lnbi11cD5gIGRyYXdzIHRoZSBub3RpY2UpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9sZEV4aXN0aW5nQWNjb3VudE5vdGljZSA9IGZhbHNlLFxuICApIHtcbiAgICAvLyBTZWVkZWQgZnJvbSBhIHJlZGlyZWN0IHRoYXQgY2FtZSBiYWNrIG1pZC1mbG93IChlLmcuIE9BdXRoIG5lZWRpbmcgYSBzZWNvbmRcbiAgICAvLyBmYWN0b3IpIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIGRlbWFuZGVkIHN0ZXAgaW5zdGVhZCBvZiBzdGFydGluZyBvdmVyLlxuICAgIHRoaXMuc3RhdGUgPSBzaWduYWw8Rmxvd1N0YXRlPihwZW5kaW5nID8gZmxvd0Zyb21QZW5kaW5nKHBlbmRpbmcpIDogaW5pdGlhbEZsb3cpO1xuICAgIHRoaXMuZW5yb2xsbWVudCA9IGNyZWF0ZU1mYUVucm9sbG1lbnQodGhpcy5jbGllbnQsICgpID0+IHRoaXMubWZhQ2hvaWNlcygpKTtcbiAgICB0aGlzLmVucm9sbG1lbnRTdGF0ZSA9IHNpZ25hbDxNZmFFbnJvbGxtZW50U3RhdGU+KHRoaXMuZW5yb2xsbWVudC5zdGF0ZSk7XG4gICAgdGhpcy5lbnJvbGxtZW50LnN1YnNjcmliZSgobmV4dCkgPT4gdGhpcy5lbnJvbGxtZW50U3RhdGUuc2V0KG5leHQpKTtcbiAgICB0aGlzLnBhc3NrZXkgPSBjcmVhdGVQYXNza2V5U2lnbkluQ29udHJvbGxlcih7XG4gICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgb25TdGFydDogKCkgPT4gdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpLFxuICAgICAgb25SZXN1bHQ6IChuZXh0KSA9PiB0aGlzLmZpbmlzaChuZXh0KSxcbiAgICAgIGNhcHRjaGE6ICgpID0+IHRoaXMuY2FwdGNoYSxcbiAgICAgIGNhbmNlbGxlZE1lc3NhZ2U6ICgpID0+IHRoaXMudCgnc2lnbkluLnBhc3NrZXlDYW5jZWxsZWQnKSxcbiAgICB9KTtcbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gICAgdGhpcy5zeW5jRW5yb2xsbWVudCgpO1xuICB9XG5cbiAgLyoqIFdoeSBcIkNvbnRpbnVlIHdpdGggQXRsYXNcIiBjb3VsZCBub3Qgc3RhcnQgKHRoZSBzZXJ2ZXIncyBtZXNzYWdlKTsgbnVsbCBvdGhlcndpc2UuICovXG4gIHJlYWRvbmx5IHNpZ25JbldpdGhBdGxhc0Vycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBcIkNvbnRpbnVlIHdpdGggQXRsYXNcIiAod2hlbiBgc2V0dGluZ3MoKS5zaWduSW5XaXRoQXRsYXNgIGlzIHNldCk6IHN0YXJ0cyB0aGVcbiAgICogU1NPIHNpZ24taW4gYW5kIHNlbmRzIHRoZSBicm93c2VyIHRvIEF0bGFzLlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aEF0bGFzKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgdGhpcy5zaWduSW5XaXRoQXRsYXNFcnJvci5zZXQobnVsbCk7XG4gICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN0YXJ0U2lnbkluV2l0aEF0bGFzKHRoaXMuY2xpZW50LCBjb25uZWN0aW9uSWQsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICBpZiAoJ3VybCcgaW4gc3RhcnRlZCkgd2luZG93LmxvY2F0aW9uLmFzc2lnbihzdGFydGVkLnVybCk7XG4gICAgZWxzZSB0aGlzLnNpZ25JbldpdGhBdGxhc0Vycm9yLnNldChzdGFydGVkLmVycm9yKTtcbiAgfVxuXG4gIC8qKiBcIlNpZ24gaW4gd2l0aCBhIHBhc3NrZXlcIiBpcyBvZmZlcmVkOiB0aGUgZmlyc3Qgc3RlcCwgdGhlIGluc3RhbmNlIHR1cm5lZCBwYXNza2V5IHNpZ24taW4gb24sIGFuZCB0aGUgYnJvd3NlciBjYW4uICovXG4gIHBhc3NrZXlPZmZlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhc3NrZXlTdXBwb3J0ZWQoKSAmJiAhdGhpcy5zdGF0ZSgpLmF0dGVtcHQgJiYgdGhpcy5zZXR0aW5ncygpPy5wYXNza2V5U2lnbkluID09PSB0cnVlO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGFwcCBsZXRzIHRoZSBNRkEgc3RlcHMgb2ZmZXIgKGZyb20ge0BsaW5rIHNldHRpbmdzfSkuICovXG4gIG1mYUNob2ljZXMoKTogTWZhQ2hvaWNlcyB7XG4gICAgcmV0dXJuIG1mYUNob2ljZXNGcm9tKHRoaXMuc2V0dGluZ3MoKT8uYWNjb3VudCk7XG4gIH1cblxuICAvKiogU3RhcnQgdGhlIGVucm9sbWVudCBzdGVwIGZvciBpdHMgYXR0ZW1wdCwgb3IgcmVzZXQgaXQgb25jZSB0aGUgZmxvdyBsZWF2ZXMuICovXG4gIHByaXZhdGUgc3luY0Vucm9sbG1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGlmIChhdHRlbXB0Py5zdGF0dXMgPT09ICduZWVkc19tZmFfZW5yb2xsbWVudCcgJiYgYXR0ZW1wdC5pZCkgdGhpcy5lbnJvbGxtZW50LnN0YXJ0KGF0dGVtcHQuaWQpO1xuICAgIGVsc2UgdGhpcy5lbnJvbGxtZW50LnJlc2V0KCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIGluc3RhbmNlJ3MgcHVibGljIHNldHRpbmdzIGFuZCBkcmF3IHdoYXRldmVyIGNhcHRjaGEgdGhleSByZXF1aXJlLiAqL1xuICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgZmV0Y2hJbnN0YW5jZVNldHRpbmdzKHRoaXMuY2xpZW50KTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnNldChsb2FkZWQpO1xuICAgICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgICAgaWYgKGxvYWRlZC5hY2NvdW50Lmxhc3RTaWduSW5NZXRob2QpIHRoaXMubGFzdE1ldGhvZC5zZXQoYXdhaXQgZmV0Y2hMYXN0U2lnbkluTWV0aG9kKHRoaXMuY2xpZW50KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3JzIHRvIG9mZmVyIG9uIGEgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcDogdGhlIHNlcnZlcidzIGxpc3RcbiAgICogd2l0aG91dCBlbWFpbCBjb2RlIC8gbGluayB3aGlsZSB0aGUgYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsXG4gICAqIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5hdmFpbGFibGUgPT09IGZhbHNlYCkuIEVtcHR5IG9uIGFueSBvdGhlciBzdGVwLlxuICAgKi9cbiAgZmlyc3RGYWN0b3JzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ7XG4gICAgY29uc3Qgc3RlcCA9IGF0dGVtcHQgPyBuZXh0U3RlcChhdHRlbXB0KSA6IG51bGw7XG4gICAgaWYgKHN0ZXA/LmtpbmQgIT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicpIHJldHVybiBbXTtcbiAgICBjb25zdCBvZmZlcmVkID0gb2ZmZXJlZEZpcnN0RmFjdG9ycyhzdGVwLnN0cmF0ZWdpZXMsIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeSk7XG4gICAgY29uc3QgcHJvb2YgPSB0aGlzLmhvbGRQcm9vZigpO1xuICAgIHJldHVybiBwcm9vZiAmJiAhb2ZmZXJlZC5pbmNsdWRlcyhwcm9vZikgPyBbLi4ub2ZmZXJlZCwgcHJvb2ZdIDogb2ZmZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW1haWxlZCBwcm9vZiBhIHBhc3N3b3JkIGhvbGQgc3RpbGwgd2FpdHMgb24gKGBGbG93U3RhdGUucGFzc3dvcmRIb2xkYCk6IHRoZVxuICAgKiBjb2RlLCBvciBhIGxpbmsgd2hlcmUgdGhlIGluc3RhbmNlIHZlcmlmaWVzIGJ5IGxpbmsgb25seS4gTnVsbCB3aXRoIG5vIGhvbGQsIG9uY2VcbiAgICogcHJvdmVuLCBvciB3aGlsZSB0aGUgYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsLlxuICAgKi9cbiAgaG9sZFByb29mKCk6ICdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyB8IG51bGwge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLnN0YXRlKCkucGFzc3dvcmRIb2xkO1xuICAgIGlmICghaG9sZCB8fCBob2xkLnJlbGVhc2VkIHx8IHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeT8uYXZhaWxhYmxlID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uYWNjb3VudD8uZW1haWxWZXJpZmljYXRpb24gPT09ICdsaW5rJyA/ICdlbWFpbF9saW5rJyA6ICdlbWFpbF9jb2RlJztcbiAgfVxuXG4gIC8qKiBCYWNrIGZyb20gdGhlIGVtYWlsZWQgZmFjdG9yIHRvIHRoZSBwYXNzd29yZCBmaWVsZC4gKi9cbiAgdXNlUGFzc3dvcmQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHByZXBhcmVkOiBudWxsLCBwb2xsU2VjcmV0OiBudWxsLCBlcnJvcnM6IFtdIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gZW1haWwgKyBwYXNzd29yZCBzaWduLXVwIGNhbm5vdCBjb21wbGV0ZSBiZWNhdXNlIHRoZSBhcHAgY2Fubm90XG4gICAqIHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlYCk6XG4gICAqIGA8YXRsYXMtc2lnbi11cD5gIHNob3dzIHRoZSBcImNhbid0IHNlbmQgZW1haWxcIiBub3RpY2UgaW5zdGVhZCBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHNpZ25VcEVtYWlsVW5hdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICAvKiogRmFsc2Ugd2hlbiBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIGNhbm5vdCBiZSBkZWxpdmVyZWQg4oCUIGhpZGUgXCJGb3Jnb3QgcGFzc3dvcmQ/XCIuICovXG4gIHBhc3N3b3JkUmVzZXRBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeS5wYXNzd29yZFJlc2V0ICE9PSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgdGhlIHNlcnZlciB0byBlbWFpbCBhIHNpZ24taW4gY29kZSBmb3IgdGhlIGN1cnJlbnQgYG5lZWRzX2ZpcnN0X2ZhY3RvcmBcbiAgICogc3RlcCAoYFBPU1Qg4oCmL3ByZXBhcmVfZmlyc3RfZmFjdG9yYCk7IHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgdGhlIGNvZGUsIHdoaWNoXG4gICAqIHtAbGluayBzdWJtaXR9IHBvc3RzIGFzIHRoZSBgZW1haWxfY29kZWAgc3RyYXRlZ3kuIFdoaWxlIGEgcGFzc3dvcmQgaG9sZCB3YWl0c1xuICAgKiBvbiBpdCAoe0BsaW5rIGhvbGRQcm9vZn0pLCB0aGlzIGVtYWlscyB0aGF0IHByb29mIGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlKHN0cmF0ZWd5OiAnZW1haWxfY29kZScgfCAnZW1haWxfbGluaycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZmlyc3RGYWN0b3JzKCkuaW5jbHVkZXMoc3RyYXRlZ3kpKSByZXR1cm47XG4gICAgY29uc3QgcHJvb2YgPSB0aGlzLmhvbGRQcm9vZigpO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID1cbiAgICAgIHN0cmF0ZWd5ID09PSBwcm9vZlxuICAgICAgICA/IGF3YWl0IHByZXBhcmVQYXNzd29yZEhvbGRQcm9vZih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpLCBwcm9vZilcbiAgICAgICAgOiBhd2FpdCBwcmVwYXJlRmFjdG9yKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHN0cmF0ZWd5KTtcbiAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgIGlmICghbmV4dC5lcnJvcnMubGVuZ3RoKSB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChzdHJhdGVneSk7XG4gICAgdGhpcy5zeW5jUG9sbGluZygpO1xuICB9XG5cbiAgLyoqIEtlZXAgYm90aCBjYXB0Y2hhcyBpbiBzdGVwIHdpdGggdGhlIHNldHRpbmdzIGFuZCB0aGUgZmxvdydzIGN1cnJlbnQgc3RlcC4gKi9cbiAgcHJpdmF0ZSBzeW5jQ2FwdGNoYSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICB0aGlzLmNhcHRjaGEuY29uZmlndXJlKFxuICAgICAgc2lnbkluQ2FwdGNoYU9wdGlvbnMoc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduSW4sIHN0YXRlLCAoKSA9PiB2b2lkIHRoaXMuc3VibWl0KHt9KSksXG4gICAgKTtcbiAgICBjb25zdCBzaWduVXBGbG93ID0gc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduVXA7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmNvbmZpZ3VyZSh7XG4gICAgICBmbG93OiBzaWduVXBGbG93LFxuICAgICAgYWN0aXZlOiAhc3RhdGUuYXR0ZW1wdCAmJiBmbG93TmVlZHNDYXB0Y2hhKHNpZ25VcEZsb3cpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FwdGNoYURyYXduLnNldCh0aGlzLmNhcHRjaGEubmVlZGVkKTtcbiAgICB0aGlzLnNpZ25VcENhcHRjaGFEcmF3bi5zZXQodGhpcy5zaWduVXBDYXB0Y2hhLm5lZWRlZCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXRlKG5leHQ6IEZsb3dTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzSWQgPSBwcmV2aW91cy5hdHRlbXB0Py5pZCA/PyBudWxsO1xuICAgIHRoaXMuc3RhdGUuc2V0KG5leHQpO1xuICAgIC8vIEEgcHJvdmVuIGhvbGQgZ29lcyBiYWNrIHRvIHRoZSBwYXNzd29yZCBmaWVsZC5cbiAgICBpZiAobmV4dC5wYXNzd29yZEhvbGQ/LnJlbGVhc2VkICYmICFwcmV2aW91cy5wYXNzd29yZEhvbGQ/LnJlbGVhc2VkKSB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChudWxsKTtcbiAgICAvLyBBIHByZXBhcmVkIGZhY3RvciBiZWxvbmdzIHRvIHRoZSBmaXJzdC1mYWN0b3Igc3RlcCBpdCB3YXMgc2VudCBmb3IuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfZmlyc3RfZmFjdG9yJykgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgLy8gQW4gZW1haWxlZCBzZWNvbmQtZmFjdG9yIGNvZGUgYmVsb25ncyB0byB0aGUgc2Vjb25kLWZhY3RvciBzdGVwIG9mIHRoaXMgYXR0ZW1wdC5cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgIT09ICduZWVkc19zZWNvbmRfZmFjdG9yJyB8fCAobmV4dC5hdHRlbXB0Py5pZCA/PyBudWxsKSAhPT0gcHJldmlvdXNJZCkge1xuICAgICAgdGhpcy5lbWFpbFNlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNtc1NlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhcHRjaGEoKTtcbiAgICB0aGlzLnN5bmNFbnJvbGxtZW50KCk7XG4gICAgdGhpcy5hdXRvU2VuZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvU2VudEZvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBXaXRoIG5vIHBhc3N3b3JkIG9uIG9mZmVyLCBlbWFpbCB0aGUgY29kZSBhcyBzb29uIGFzIHRoZSBzZXJ2ZXIgYXNrcyBmb3IgYVxuICAgKiBmaXJzdCBmYWN0b3Ig4oCUIG9uY2UgcGVyIGF0dGVtcHQsIHNvIGEgZmFpbGVkIHNlbmQgd2FpdHMgZm9yIHRoZSB1c2VyJ3MgcmV0cnlcbiAgICogKHRoZSBcIkVtYWlsIG1lIGEgY29kZVwiIGJ1dHRvbikgaW5zdGVhZCBvZiBsb29waW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhdXRvU2VuZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0Py5pZCA/PyBudWxsO1xuICAgIGlmICghaWQgfHwgdGhpcy5hdXRvU2VudEZvciA9PT0gaWQgfHwgdGhpcy5wcmVwYXJlZEZhY3RvcigpKSByZXR1cm47XG4gICAgaWYgKHBsYW5GaXJzdEZhY3Rvcih0aGlzLmZpcnN0RmFjdG9ycygpKS5hdXRvU2VuZCAhPT0gJ2VtYWlsX2NvZGUnKSByZXR1cm47XG4gICAgdGhpcy5hdXRvU2VudEZvciA9IGlkO1xuICAgIHZvaWQgdGhpcy5wcmVwYXJlKCdlbWFpbF9jb2RlJyk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSB0aGUgZmxvdyB3aXRoIHRoZSB2YWx1ZXMgdGhlIHVzZXIgdHlwZWQuIE9uIGNvbXBsZXRpb24sIGV4Y2hhbmdlIHRoZVxuICAgKiBvbmUtdGltZSB0aWNrZXQgZm9yIGNvb2tpZXMgb3ZlciBhIHNhbWUtb3JpZ2luIHJlcXVlc3QgKEZBUEkgaXMgY3Jvc3Mtb3JpZ2luXG4gICAqIGFuZCBjYW5ub3Qgc2V0IHRoZSBjb29raWUgb24gaXRzIG93biByZXNwb25zZSksIHRoZW4gcmUtYm9vdCBzbyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgYXBwIHNlZXMgYSBzaWduZWQtaW4gdXNlci5cbiAgICovXG4gIGFzeW5jIHN1Ym1pdCh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG5cbiAgICAvLyBBIGNvZGUgdGhhdCBsaWZ0cyBhIHBhc3N3b3JkIGhvbGQgZ29lcyB0byBpdHMgb3duIGF0dGVtcHQsIG5vdCB0aGlzIHNpZ24taW4uXG4gICAgaWYgKHRoaXMucHJlcGFyZWRGYWN0b3IoKSA9PT0gJ2VtYWlsX2NvZGUnICYmIHRoaXMuaG9sZFByb29mKCkgPT09ICdlbWFpbF9jb2RlJykge1xuICAgICAgdGhpcy5zZXRTdGF0ZShhd2FpdCBhdHRlbXB0UGFzc3dvcmRIb2xkUHJvb2YodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgdmFsdWVzLmNvZGUgPz8gJycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgYWR2YW5jZVdpdGhDYXB0Y2hhKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHZhbHVlcywge1xuICAgICAgY2FwdGNoYTogdGhpcy5jYXB0Y2hhLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgdDogdGhpcy50LFxuICAgIH0pO1xuICAgIHRoaXMuaWRlbnRpZmllciA9IG91dC5pZGVudGlmaWVyO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKG91dC5zdGF0ZSk7XG4gIH1cblxuICAvKiogTG9hZCB0aGUgc2lnbi11cCdzIHBvbGljaWVzIGludG8ge0BsaW5rIHBvbGljaWVzfSAoYDxhdGxhcy1zaWduLXVwPmAgY2FsbHMgaXQgb24gaW5pdCkuICovXG4gIGFzeW5jIGxvYWRQb2xpY2llcyhsb2NhbGU/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBvbGljaWVzLnNldFBvbGljaWVzKGF3YWl0IGxvYWRQb2xpY2llcyh0aGlzLmNsaWVudCwgeyBsb2NhbGUgfSkpO1xuICB9XG5cbiAgLyoqIFRoZSB1c2VyIGRlY2xpbmVkIGEgcG9saWN5IGEgc2lnbi1pbiB3YXMgd2FpdGluZyBvbjogY2FuY2VsIHRoZSBhdHRlbXB0IGFuZCBzYXkgd2h5LiAqL1xuICBkZWNsaW5lUG9saWN5KHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnNldCh7XG4gICAgICAuLi5pbml0aWFsRmxvdyxcbiAgICAgIGVycm9yczogW3sgY29kZTogJ1BPTElDWV9ERUNMSU5FRCcsIG1lc3NhZ2U6IHRoaXMudCgncG9saWN5LmRlY2xpbmVkJykucmVwbGFjZSgne3BvbGljeX0nLCB0aXRsZSkgfV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGFjY291bnQgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHNgKSBmcm9tIGEgY3JlYXRlLWFjY291bnQgZm9ybSdzXG4gICAqIHZhbHVlcyDigJQgZW1haWwsIHBhc3N3b3JkIGFuZCBhbnkgY29uZmlndXJlZCBzaWduLXVwIGZpZWxkcyDigJQgY2FycnlpbmcgdGhlXG4gICAqIHNpZ24tdXAgY2FwdGNoYSdzIHRva2VuIHdoZW4gdGhlIGluc3RhbmNlIHJlcXVpcmVzIG9uZS4gVGhlIGVtYWlsZWQgY29kZSBpc1xuICAgKiB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uc2VudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgY29uc3QgbmV4dCA9IGF3YWl0IGNyZWF0ZVNpZ25VcCh0aGlzLmNsaWVudCwgdmFsdWVzLCB7XG4gICAgICBjb25zZW50LFxuICAgICAgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLFxuICAgICAgdDogdGhpcy50LFxuICAgICAgcG9saWNpZXM6IHRoaXMucG9saWNpZXMsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5maW5pc2gobmV4dCk7XG4gIH1cblxuICAvKipcbiAgICogXCJFbWFpbCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh0aGUgaW5zdGFuY2Unc1xuICAgKiBgYWNjb3VudC5lbWFpbFNlY29uZEZhY3RvcmApOiBtYWlscyBhIGNvZGUgdG8gdGhlIGFjY291bnQncyB2ZXJpZmllZCBlbWFpbDtcbiAgICogaXQgaXMgdGhlbiBwb3N0ZWQgd2l0aCB7QGxpbmsgc3VibWl0fSBsaWtlIGFueSAyRkEgY29kZS5cbiAgICovXG4gIGFzeW5jIHNlbmRFbWFpbFNlY29uZEZhY3RvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRTZWNvbmRGYWN0b3JDb2RlKCdlbWFpbF9jb2RlJywgdGhpcy5lbWFpbFNlY29uZEZhY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogXCJUZXh0IG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHdoZXJlIHRoZSBhcHAgb2ZmZXJzIHRleHRlZFxuICAgKiBjb2Rlcywge0BsaW5rIG1mYUNob2ljZXN9YCgpLnNtc2ApOiB0ZXh0cyBhIGNvZGUgdG8gdGhlIGFjY291bnQncyBlbnJvbGxlZFxuICAgKiBwaG9uZTsgaXQgaXMgdGhlbiBwb3N0ZWQgd2l0aCB7QGxpbmsgc3VibWl0fSBsaWtlIGFueSAyRkEgY29kZS5cbiAgICovXG4gIGFzeW5jIHNlbmRTbXNTZWNvbmRGYWN0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZW5kU2Vjb25kRmFjdG9yQ29kZSgnc21zJywgdGhpcy5zbXNTZWNvbmRGYWN0b3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kU2Vjb25kRmFjdG9yQ29kZShcbiAgICBzdHJhdGVneTogJ3NtcycgfCAnZW1haWxfY29kZScsXG4gICAgb3V0OiBXcml0YWJsZVNpZ25hbDx7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQ7XG4gICAgaWYgKCFpZCkgcmV0dXJuO1xuICAgIG91dC5zZXQoeyBidXN5OiB0cnVlIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHNlbnRUbyB9ID0gYXdhaXQgcHJlcGFyZVNlY29uZEZhY3RvckNvZGUodGhpcy5jbGllbnQsIGlkLCBzdHJhdGVneSk7XG4gICAgICBvdXQuc2V0KHsgc2VudFRvIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBvdXQuc2V0KHsgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogdGhpcy50KCdlcnJvci5nZW5lcmljJykgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2VuZCBhIHNpZ24tdXAncyBlbWFpbGVkIGNvZGUgLyBsaW5rICh0aGUgZWFybGllciBvbmUgc3RvcHMgd29ya2luZykuICovXG4gIGFzeW5jIHJlc2VuZFNpZ25VcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgdGhpcy5zdGF0ZS5zZXQoYXdhaXQgcmVzZW5kU2lnblVwVmVyaWZpY2F0aW9uKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHBhc3NrZXktb25seSBzaWduLXVwIChgUE9TVCAvdjEvY2xpZW50L3NpZ25fdXBzL3Bhc3NrZXlgKSBmcm9tIHRoZVxuICAgKiBjcmVhdGUtYWNjb3VudCBmb3JtJ3MgdmFsdWVzIOKAlCBubyBwYXNzd29yZC4gT2ZmZXJlZCB3aGVuIHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LnBhc3NrZXlTaWduVXBgIGlzIHNldC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVdpdGhQYXNza2V5KHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uc2VudCA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYnVzeTogdHJ1ZSwgZXJyb3JzOiBbXSB9KSk7XG4gICAgYXdhaXQgdGhpcy5maW5pc2goYXdhaXQgY3JlYXRlUGFzc2tleVNpZ25VcCh0aGlzLmNsaWVudCwgdmFsdWVzLCB7IGNvbnNlbnQsIGNhcHRjaGE6IHRoaXMuc2lnblVwQ2FwdGNoYSwgdDogdGhpcy50LCBwb2xpY2llczogdGhpcy5wb2xpY2llcyB9KSk7XG4gIH1cblxuICAvKiogVGhlIHBhc3NrZXktb25seSBzaWduLXVwJ3MgbGFzdCBzdGVwOiBjcmVhdGUgdGhlIHBhc3NrZXksIGFuZCB3aXRoIGl0IHRoZSBhY2NvdW50LiAqL1xuICBhc3luYyBjcmVhdGVQYXNza2V5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhd2FpdCBmaW5pc2hQYXNza2V5U2lnblVwKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHsgdDogdGhpcy50IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3ZlcnkgY29kZXMgYW4gTUZBIGVucm9sbWVudCBqdXN0IGNvbXBsZXRlZCB0aGUgc2lnbi1pbiB3aXRoLCBzaG93blxuICAgKiBvbmNlIGJlZm9yZSBpdCBmaW5pc2hlcyAoe0BsaW5rIHNhdmVSZWNvdmVyeUNvZGVzfSk7IG51bGwgb3RoZXJ3aXNlLiBUaGV5XG4gICAqIGxpdmUgb25seSBpbiB0aGlzIGNvbnRyb2xsZXIncyBtZW1vcnkuXG4gICAqL1xuICByZWNvdmVyeUNvZGVzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHBlbmRpbmdSZWNvdmVyeUNvZGVzKHRoaXMuc3RhdGUoKSk7XG4gIH1cblxuICAvKiogXCJJJ3ZlIHNhdmVkIG15IGNvZGVzXCI6IGZvcmdldCB0aGUgcmVjb3ZlcnkgY29kZXMgYW5kIGZpbmlzaCB0aGUgc2lnbi1pbi4gKi9cbiAgYXN5bmMgc2F2ZVJlY292ZXJ5Q29kZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maW5pc2goYWNrbm93bGVkZ2VSZWNvdmVyeUNvZGVzKHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgLyoqIFRoZSBhZGRyZXNzIGJlbG9uZ2VkIHRvIGFuIGV4aXN0aW5nIGFjY291bnQ6IHRoZSBub3RpY2UgaXMgdXAgdW50aWwge0BsaW5rIGNvbnRpbnVlQWZ0ZXJFeGlzdGluZ0FjY291bnR9LiAqL1xuICBleGlzdGluZ0FjY291bnROb3RpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlbmRpbmdFeGlzdGluZ0FjY291bnROb3RpY2UodGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIC8qKiBUaGUgdXNlciByZWFkIHRoZSBub3RpY2U6IGZpbmlzaCB0aGUgc2lnbi11cC4gKi9cbiAgYXN5bmMgY29udGludWVBZnRlckV4aXN0aW5nQWNjb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhY2tub3dsZWRnZUV4aXN0aW5nQWNjb3VudCh0aGlzLnN0YXRlKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluaXNoKG5leHQ6IEZsb3dTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFuIGVucm9sbWVudCdzIHJlY292ZXJ5IGNvZGVzIGFyZSBzaG93biBmaXJzdDsgYHNhdmVSZWNvdmVyeUNvZGVzYCBmaW5pc2hlcy5cbiAgICBpZiAocGVuZGluZ1JlY292ZXJ5Q29kZXMobmV4dCkpIHtcbiAgICAgIC8vIFRoZSB0aWNrZXQgZGllcyBpbiA2MCBzZWNvbmRzIGFuZCBzYXZpbmcgdGhlIGNvZGVzIGNhbiB0YWtlIGxvbmdlcjogcmVkZWVtIGl0IG5vdyxcbiAgICAgIC8vIGFuZCBgc2F2ZVJlY292ZXJ5Q29kZXNgIGZpbmlzaGVzLiBBIHJlZnVzZWQgZXhjaGFuZ2Uga2VlcHMgdGhlIHRpY2tldCwgc28gdGhlIHNhdmUgcmVwb3J0cyBpdC5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiB0cnVlIH0pO1xuICAgICAgY29uc3QgcmVzID0gbmV4dC50aWNrZXRcbiAgICAgICAgPyBhd2FpdCB0aGlzLmNsaWVudC5wb3N0KCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7IGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCwgdGlja2V0OiBuZXh0LnRpY2tldCB9KVxuICAgICAgICA6IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogZmFsc2UsIHRpY2tldDogcmVzPy5vayA/IG51bGwgOiBuZXh0LnRpY2tldCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzID09PSAnY29tcGxldGUnKSB7XG4gICAgICAvLyBTdGF5cyBidXN5IHVudGlsIHRoaXMgYnJvd3NlciBhY3R1YWxseSBob2xkcyB0aGUgc2Vzc2lvbjogdGhlIGNvbXBsZXRpb25cbiAgICAgIC8vIGFsb25lIHNheXMgbm90aGluZyBhYm91dCB3aGV0aGVyIHRoZSBjb29raWUgd2FzIGtlcHQuXG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogdHJ1ZSB9KTtcbiAgICAgIGxldCBleGNoYW5nZWQgPSB0cnVlO1xuICAgICAgaWYgKG5leHQudGlja2V0KSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHtcbiAgICAgICAgICBhdHRlbXB0X2lkOiAobmV4dC5hdHRlbXB0IGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQsXG4gICAgICAgICAgdGlja2V0OiBuZXh0LnRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4Y2hhbmdlZCA9IHJlcy5vaztcbiAgICAgIH1cbiAgICAgIGlmIChleGNoYW5nZWQgJiYgdGhpcy5ob2xkRXhpc3RpbmdBY2NvdW50Tm90aWNlICYmIHBlbmRpbmdFeGlzdGluZ0FjY291bnROb3RpY2UobmV4dCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIHRpY2tldDogbnVsbCwgYnVzeTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtlcHQgPSBleGNoYW5nZWQgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IGZhbHNlLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgIC8vIEEgbWFnaWMtbGluayBzdGVwIG1heSBub3cgYmUgcG9sbGFibGUgKGEgbGluayBvcGVuZWQgb24gYW5vdGhlciBkZXZpY2UpLlxuICAgICAgdGhpcy5zeW5jUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGFydC9zdG9wIHRoZSDCpzUuMyBtYWdpYy1saW5rIHBvbGwgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdGUuICovXG4gIHN5bmNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmIChzaG91bGRLZWVwUG9sbGluZyh0aGlzLnN0YXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSByZXR1cm47XG4gICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvbGxlZCA9IHRoaXMuc3RhdGUoKTtcbiAgICAgICAgY29uc3QgeyBzdGF0ZTogbmV4dCwgdGlja2V0IH0gPSBhd2FpdCBwb2xsQXR0ZW1wdCh0aGlzLmNsaWVudCwgcG9sbGVkKTtcbiAgICAgICAgLy8gQSByZXNlbmQgcm90YXRlZCB0aGUgc2VjcmV0IG1lYW53aGlsZTogdGhpcyBhbnN3ZXIgaXMgc3RhbGUuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlKCkucG9sbFNlY3JldCA9PT0gcG9sbGVkLnBvbGxTZWNyZXQpIHRoaXMuc2V0U3RhdGUobmV4dCk7XG4gICAgICAgIC8vIGUuZy4gYSBwYXNza2V5IHNpZ24tdXAgd2hvc2UgZW1haWwgd2FzIGp1c3QgcHJvdmVuOiBvbmx5IHRoaXMgdGFiIGNhbiBnbyBvbi5cbiAgICAgICAgaWYgKCF0aWNrZXQgJiYgIXNob3VsZEtlZXBQb2xsaW5nKG5leHQpKSB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgICAgIGlmICghdGlja2V0IHx8ICFuZXh0LmF0dGVtcHQpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgdGlja2V0IGlzIGV4Y2hhbmdlZCBieSBhIG5vcm1hbCByZXF1ZXN0LCBzbyBubyBzZXNzaW9uIHRva2VuIGV2ZXJcbiAgICAgICAgLy8gYXBwZWFycyBpbiBhIFVSTC5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBrZXB0ID0gcmVzLm9rICYmIChhd2FpdCB0aGlzLnJlbG9hZCgpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuc3RhdGUoKSwgc2Vzc2lvbktlcHQ6IGtlcHQgfSk7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgIH0pKCk7XG4gICAgfSwgMl8wMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoZSBwb2xsIHRpbWVyIGFuZCB0aGUgY2FwdGNoYSB3aWRnZXRzIOKAlCBjYWxsIGZyb20gdGhlIGNvbXBvbmVudCdzIGBuZ09uRGVzdHJveWAuICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5wYXNza2V5LnN0b3BBdXRvZmlsbCgpO1xuICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB0aGlzLmNhcHRjaGEuZGVzdHJveSgpO1xuICAgIHRoaXMuc2lnblVwQ2FwdGNoYS5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
|
|
481
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zsb3ctY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsNEJBQTRCLEVBQzVCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFdBQVcsRUFDWCxRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiwwQkFBMEIsRUFDMUIsWUFBWSxHQVFiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTNDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBK0RYO0lBQ0E7SUFHQTtJQUVBO0lBcEVWLEtBQUssQ0FBNEI7SUFDMUM7Ozs7T0FJRztJQUNNLFFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzFEOzs7T0FHRztJQUNNLFVBQVUsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ2xELHlFQUF5RTtJQUNoRSxPQUFPLEdB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Q0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLE9BQU87UUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRmFwaUNsaWVudCxcbiAgYWR2YW5jZVdpdGhDYXB0Y2hhLFxuICBhdGxhc0NhcHRjaGFMYWJlbHMsXG4gIGF0dGVtcHRQYXNzd29yZEhvbGRQcm9vZixcbiAgcHJlcGFyZVBhc3N3b3JkSG9sZFByb29mLFxuICBjcmVhdGVDYXB0Y2hhQ29udHJvbGxlcixcbiAgY3JlYXRlUGFzc2tleVNpZ25JbkNvbnRyb2xsZXIsXG4gIGNyZWF0ZVBhc3NrZXlTaWduVXAsXG4gIGNyZWF0ZVNpZ25VcCxcbiAgZmluaXNoUGFzc2tleVNpZ25VcCxcbiAgZmV0Y2hJbnN0YW5jZVNldHRpbmdzLFxuICBmZXRjaExhc3RTaWduSW5NZXRob2QsXG4gIHN0YXJ0U2lnbkluV2l0aEF0bGFzLFxuICBjcmVhdGVNZmFFbnJvbGxtZW50LFxuICBhY2tub3dsZWRnZUV4aXN0aW5nQWNjb3VudCxcbiAgYWNrbm93bGVkZ2VSZWNvdmVyeUNvZGVzLFxuICBwZW5kaW5nRXhpc3RpbmdBY2NvdW50Tm90aWNlLFxuICBwZW5kaW5nUmVjb3ZlcnlDb2RlcyxcbiAgbWZhQ2hvaWNlc0Zyb20sXG4gIHByZXBhcmVTZWNvbmRGYWN0b3JDb2RlLFxuICBzZW5kT25seVdheVNlY29uZEZhY3RvckNvZGUsXG4gIGNvbnRpbnVlT25Ib3N0ZWRQYWdlLFxuICByZXNlbmRTaWduVXBWZXJpZmljYXRpb24sXG4gIGZsb3dOZWVkc0NhcHRjaGEsXG4gIHNpZ25JbkNhcHRjaGFPcHRpb25zLFxuICBmbG93RnJvbVBlbmRpbmcsXG4gIGluaXRpYWxGbG93LFxuICBuZXh0U3RlcCxcbiAgb2ZmZXJlZEZpcnN0RmFjdG9ycyxcbiAgcG9sbEF0dGVtcHQsXG4gIHByZXBhcmVGYWN0b3IsXG4gIHBsYW5GaXJzdEZhY3RvcixcbiAgc2hvdWxkS2VlcFBvbGxpbmcsXG4gIFBvbGljeUFjY2VwdGFuY2VDb250cm9sbGVyLFxuICBsb2FkUG9saWNpZXMsXG4gIHR5cGUgQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIHR5cGUgRmxvd1N0YXRlLFxuICB0eXBlIEluc3RhbmNlU2V0dGluZ3MsXG4gIHR5cGUgTWZhQ2hvaWNlcyxcbiAgdHlwZSBNZmFFbnJvbGxtZW50Q29udHJvbGxlcixcbiAgdHlwZSBNZmFFbnJvbGxtZW50U3RhdGUsXG4gIHR5cGUgUGFzc2tleVNpZ25JbkNvbnRyb2xsZXIsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgRU5fVVMsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuXG4vKipcbiAqIFRoZSBzZXJ2ZXItZHJpdmVuIHNpZ24taW4gLyBzaWduLXVwIGVuZ2luZSwgc2hhcmVkIGJ5IGA8YXRsYXMtc2lnbi1pbj5gIGFuZFxuICogYDxhdGxhcy1zaWduLXVwPmAg4oCUIHRoZSBBbmd1bGFyIGNvdW50ZXJwYXJ0IG9mIFJlYWN0J3MgYHVzZUZsb3dgIGhvb2suXG4gKlxuICogSXQgb3ducyBubyBkZWNpc2lvbiBhYm91dCB3aGF0IGNvbWVzIG5leHQ6IGV2ZXJ5IHN0YXR1cyBjb21lcyBiYWNrIGZyb20gdGhlXG4gKiBzZXJ2ZXIgdmlhIGBhZHZhbmNlYCwgYW5kIHRoaXMgY29udHJvbGxlciBvbmx5IHBvc3RzIHdoYXRldmVyIHRoZSBjdXJyZW50IHN0ZXBcbiAqIG5lZWRzIGFuZCByZS1yZW5kZXJzIHRoZSByZXR1cm5lZCBzdGF0dXMuIFN0YXRlIGxpdmVzIGluIGEgc2lnbmFsIHNvIHRlbXBsYXRlc1xuICogdXBkYXRlIHdoZXRoZXIgdGhlIGFwcCBydW5zIHpvbmVkIG9yIHpvbmVsZXNzLlxuICpcbiAqIGA8YXRsYXMtc2lnbi11cD5gIHN0YXJ0cyB0aGUgYXR0ZW1wdCB3aXRoIHtAbGluayBjcmVhdGV9XG4gKiAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwc2ApOyB0aGUgZW1haWxlZC1jb2RlIHN0ZXAgdGhlbiBydW5zIHRocm91Z2ggdGhlIHNhbWVcbiAqIHtAbGluayBzdWJtaXR9LiBCb3RoIGZsb3dzIGRyYXcgdGhlIGluc3RhbmNlJ3MgY2FwdGNoYSAoZnJvbVxuICoge0BsaW5rIGxvYWRTZXR0aW5nc30pIHdoZW4gaXQgaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGxhc0Zsb3dDb250cm9sbGVyIHtcbiAgcmVhZG9ubHkgc3RhdGU6IFdyaXRhYmxlU2lnbmFsPEZsb3dTdGF0ZT47XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UncyBwdWJsaWMgc2lnbi1pbiAvIHNpZ24tdXAgc2V0dGluZ3MgKGNhcHRjaGEsIHNpZ24tdXAgZmllbGRzLFxuICAgKiBsZWdhbCBjb25zZW50KSBmcm9tIGBHRVQgL3YxL2FwcGVhcmFuY2VgOyBudWxsIHVudGlsIHtAbGluayBsb2FkU2V0dGluZ3N9XG4gICAqIHJlc29sdmVzLCBvciB3aGVuIHRoZSBzZXJ2ZXIgY291bGQgbm90IGJlIHJlYWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5ncyA9IHNpZ25hbDxJbnN0YW5jZVNldHRpbmdzIHwgbnVsbD4obnVsbCk7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIHRoaXMgYnJvd3NlciBsYXN0IHNpZ25lZCBpbiB3aXRoIChgcGFzc3dvcmRgLCBgb2F1dGhfZ2l0aHViYCwg4oCmKVxuICAgKiBmb3IgdGhlIFwiTGFzdCB1c2VkXCIgaGludDsgbnVsbCB3aGVuIG5vbmUsIG9yIHRoZSBpbnN0YW5jZSB0dXJuZWQgaXQgb2ZmLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdE1ldGhvZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgLyoqIFRoZSBzaWduLWluIGNhcHRjaGEgKGlkZW50aWZpZXIgc3RlcCAvIGBuZWVkc19jYXB0Y2hhYCBjaGFsbGVuZ2UpLiAqL1xuICByZWFkb25seSBjYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciA9IGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyKHVuZGVmaW5lZCwge1xuICAgIC8vIFRoZSBBdGxhcyBjYXB0Y2hhJ3Mgd29yZHMgZm9sbG93IHRoZSBmb3JtJ3MgY2F0YWxvZyAocmVhZCB3aGVuIGRyYXduKS5cbiAgICBhdGxhc0xhYmVsczogKCkgPT4gYXRsYXNDYXB0Y2hhTGFiZWxzKHRoaXMudCksXG4gIH0pO1xuICAvKiogVGhlIHNpZ24tdXAgY2FwdGNoYSAodGhlIGNyZWF0ZS1hY2NvdW50IHN0ZXApLiAqL1xuICByZWFkb25seSBzaWduVXBDYXB0Y2hhOiBDYXB0Y2hhQ29udHJvbGxlciA9IGNyZWF0ZUNhcHRjaGFDb250cm9sbGVyKHVuZGVmaW5lZCwge1xuICAgIGF0bGFzTGFiZWxzOiAoKSA9PiBhdGxhc0NhcHRjaGFMYWJlbHModGhpcy50KSxcbiAgfSk7XG4gIC8qKiBXaGV0aGVyIHtAbGluayBjYXB0Y2hhfSBjdXJyZW50bHkgZHJhd3MgYSB3aWRnZXQgKGZvciB0ZW1wbGF0ZXMpLiAqL1xuICByZWFkb25seSBjYXB0Y2hhRHJhd24gPSBzaWduYWwoZmFsc2UpO1xuICAvKiogV2hldGhlciB7QGxpbmsgc2lnblVwQ2FwdGNoYX0gY3VycmVudGx5IGRyYXdzIGEgd2lkZ2V0IChmb3IgdGVtcGxhdGVzKS4gKi9cbiAgcmVhZG9ubHkgc2lnblVwQ2FwdGNoYURyYXduID0gc2lnbmFsKGZhbHNlKTtcbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3IgdGhlIHNlcnZlciB3YXMgYXNrZWQgdG8gc2VuZCAoe0BsaW5rIHByZXBhcmV9KSBvbiB0aGVcbiAgICogY3VycmVudCBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIOKAlCB0aGUgZm9ybSB0aGVuIGNvbGxlY3RzIGl0cyBjb2RlLiBOdWxsXG4gICAqIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZXBhcmVkRmFjdG9yID0gc2lnbmFsPCdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyB8IG51bGw+KG51bGwpO1xuICAvKipcbiAgICogXCJFbWFpbCBtZSBhIGNvZGUgaW5zdGVhZFwiIGF0IHRoZSBzZWNvbmQgZmFjdG9yICh7QGxpbmsgc2VuZEVtYWlsU2Vjb25kRmFjdG9yfSk6XG4gICAqIGluIGZsaWdodCwgd2hlcmUgdGhlIGNvZGUgd2VudCwgb3Igd2h5IGl0IHdhcyBub3Qgc2VudC4gTnVsbCB1bnRpbCBhc2tlZCxcbiAgICogYW5kIGFnYWluIG9uY2UgdGhlIGZsb3cgbGVhdmVzIHRoYXQgc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsU2Vjb25kRmFjdG9yID0gc2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICAvKiogXCJUZXh0IG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHtAbGluayBzZW5kU21zU2Vjb25kRmFjdG9yfSk6IGFzIHtAbGluayBlbWFpbFNlY29uZEZhY3Rvcn0uICovXG4gIHJlYWRvbmx5IHNtc1NlY29uZEZhY3RvciA9IHNpZ25hbDx7IGJ1c3k/OiBib29sZWFuOyBzZW50VG8/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBudWxsPihudWxsKTtcbiAgLyoqXG4gICAqIFRoZSBNRkEgZW5yb2xtZW50IHN0ZXAgKGBuZWVkc19tZmFfZW5yb2xsbWVudGApOiB0aGUgYXV0aGVudGljYXRvciBhcHAnc1xuICAgKiBzZXR1cCAoUVIgY29kZSwgc2V0dXAga2V5KSBvciBhIHRleHRlZCBjb2RlLiBTdGFydGVkIGFuZCByZXNldCB3aXRoIHRoZSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudENvbnRyb2xsZXI7XG4gIC8qKiB7QGxpbmsgZW5yb2xsbWVudH0ncyBzdGF0ZSwgZm9yIHRlbXBsYXRlcy4gKi9cbiAgcmVhZG9ubHkgZW5yb2xsbWVudFN0YXRlOiBXcml0YWJsZVNpZ25hbDxNZmFFbnJvbGxtZW50U3RhdGU+O1xuICAvKipcbiAgICogVGhlIGluc3RhbmNlJ3MgcG9saWNpZXMgKHRlcm1zLCBwcml2YWN5LCDigKYpIGZvciB0aGUgY3JlYXRlLWFjY291bnQgZm9ybTpcbiAgICoge0BsaW5rIGNyZWF0ZX0gc2VuZHMgdGhlaXIgYWNjZXB0YW5jZXMgYW5kIHJlbG9hZHMgdGhlbSBhZnRlciBhIHJlZnVzYWwuXG4gICAqL1xuICByZWFkb25seSBwb2xpY2llcyA9IG5ldyBQb2xpY3lBY2NlcHRhbmNlQ29udHJvbGxlcihbXSk7XG4gIC8qKlxuICAgKiBQYXNza2V5IHNpZ24taW4gKHRoZSBcIlNpZ24gaW4gd2l0aCBhIHBhc3NrZXlcIiBidXR0b24gYW5kIHBhc3NrZXkgYXV0b2ZpbGwgb25cbiAgICogdGhlIGlkZW50aWZpZXIgZmllbGQpLiBUaGUgb3V0Y29tZSBnb2VzIHRocm91Z2ggdGhlIHNhbWUgY29tcGxldGlvbiBhcyBldmVyeSBzaWduLWluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc2tleTogUGFzc2tleVNpZ25JbkNvbnRyb2xsZXI7XG4gIC8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBjYW4gcnVuIFdlYkF1dGhuOyBgPGF0bGFzLXNpZ24taW4+YCBzZXRzIGl0IGFmdGVyIGl0IGlzIGNyZWF0ZWQgaW4gYSBicm93c2VyLiAqL1xuICByZWFkb25seSBwYXNza2V5U3VwcG9ydGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBwb2xsVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlkZW50aWZpZXIgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRmFwaUNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbG9hZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICBwZW5kaW5nOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsLFxuICAgIC8qKiBSZXNvbHZlcyB0aGUgY2FwdGNoYSBtZXNzYWdlcycgY2F0YWxvZyBrZXlzLiBEZWZhdWx0cyB0byBlbi1VUy4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHQ6IChrZXk6IHN0cmluZykgPT4gc3RyaW5nID0gKGtleSkgPT4gdHJhbnNsYXRlKEVOX1VTLCBrZXkpLFxuICAgIC8qKiBXYWl0IGZvciB7QGxpbmsgY29udGludWVBZnRlckV4aXN0aW5nQWNjb3VudH0gKGA8YXRsYXMtc2lnbi11cD5gIGRyYXdzIHRoZSBub3RpY2UpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9sZEV4aXN0aW5nQWNjb3VudE5vdGljZSA9IGZhbHNlLFxuICApIHtcbiAgICAvLyBTZWVkZWQgZnJvbSBhIHJlZGlyZWN0IHRoYXQgY2FtZSBiYWNrIG1pZC1mbG93IChlLmcuIE9BdXRoIG5lZWRpbmcgYSBzZWNvbmRcbiAgICAvLyBmYWN0b3IpIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIGRlbWFuZGVkIHN0ZXAgaW5zdGVhZCBvZiBzdGFydGluZyBvdmVyLlxuICAgIHRoaXMuc3RhdGUgPSBzaWduYWw8Rmxvd1N0YXRlPihwZW5kaW5nID8gZmxvd0Zyb21QZW5kaW5nKHBlbmRpbmcpIDogaW5pdGlhbEZsb3cpO1xuICAgIHRoaXMuZW5yb2xsbWVudCA9IGNyZWF0ZU1mYUVucm9sbG1lbnQodGhpcy5jbGllbnQsICgpID0+IHRoaXMubWZhQ2hvaWNlcygpKTtcbiAgICB0aGlzLmVucm9sbG1lbnRTdGF0ZSA9IHNpZ25hbDxNZmFFbnJvbGxtZW50U3RhdGU+KHRoaXMuZW5yb2xsbWVudC5zdGF0ZSk7XG4gICAgdGhpcy5lbnJvbGxtZW50LnN1YnNjcmliZSgobmV4dCkgPT4gdGhpcy5lbnJvbGxtZW50U3RhdGUuc2V0KG5leHQpKTtcbiAgICB0aGlzLnBhc3NrZXkgPSBjcmVhdGVQYXNza2V5U2lnbkluQ29udHJvbGxlcih7XG4gICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgb25TdGFydDogKCkgPT4gdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpLFxuICAgICAgb25SZXN1bHQ6IChuZXh0KSA9PiB0aGlzLmZpbmlzaChuZXh0KSxcbiAgICAgIGNhcHRjaGE6ICgpID0+IHRoaXMuY2FwdGNoYSxcbiAgICAgIGNhbmNlbGxlZE1lc3NhZ2U6ICgpID0+IHRoaXMudCgnc2lnbkluLnBhc3NrZXlDYW5jZWxsZWQnKSxcbiAgICB9KTtcbiAgICB0aGlzLnN5bmNDYXB0Y2hhKCk7XG4gICAgdGhpcy5zeW5jRW5yb2xsbWVudCgpO1xuICB9XG5cbiAgLyoqIFdoeSBcIkNvbnRpbnVlIHdpdGggQXRsYXNcIiBjb3VsZCBub3Qgc3RhcnQgKHRoZSBzZXJ2ZXIncyBtZXNzYWdlKTsgbnVsbCBvdGhlcndpc2UuICovXG4gIHJlYWRvbmx5IHNpZ25JbldpdGhBdGxhc0Vycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBcIkNvbnRpbnVlIHdpdGggQXRsYXNcIiAod2hlbiBgc2V0dGluZ3MoKS5zaWduSW5XaXRoQXRsYXNgIGlzIHNldCk6IHN0YXJ0cyB0aGVcbiAgICogU1NPIHNpZ24taW4gYW5kIHNlbmRzIHRoZSBicm93c2VyIHRvIEF0bGFzLlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aEF0bGFzKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgdGhpcy5zaWduSW5XaXRoQXRsYXNFcnJvci5zZXQobnVsbCk7XG4gICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN0YXJ0U2lnbkluV2l0aEF0bGFzKHRoaXMuY2xpZW50LCBjb25uZWN0aW9uSWQsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICBpZiAoJ3VybCcgaW4gc3RhcnRlZCkgd2luZG93LmxvY2F0aW9uLmFzc2lnbihzdGFydGVkLnVybCk7XG4gICAgZWxzZSB0aGlzLnNpZ25JbldpdGhBdGxhc0Vycm9yLnNldChzdGFydGVkLmVycm9yKTtcbiAgfVxuXG4gIC8qKiBcIlNpZ24gaW4gd2l0aCBhIHBhc3NrZXlcIiBpcyBvZmZlcmVkOiB0aGUgZmlyc3Qgc3RlcCwgdGhlIGluc3RhbmNlIHR1cm5lZCBwYXNza2V5IHNpZ24taW4gb24sIGFuZCB0aGUgYnJvd3NlciBjYW4uICovXG4gIHBhc3NrZXlPZmZlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhc3NrZXlTdXBwb3J0ZWQoKSAmJiAhdGhpcy5zdGF0ZSgpLmF0dGVtcHQgJiYgdGhpcy5zZXR0aW5ncygpPy5wYXNza2V5U2lnbkluID09PSB0cnVlO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGFwcCBsZXRzIHRoZSBNRkEgc3RlcHMgb2ZmZXIgKGZyb20ge0BsaW5rIHNldHRpbmdzfSkuICovXG4gIG1mYUNob2ljZXMoKTogTWZhQ2hvaWNlcyB7XG4gICAgcmV0dXJuIG1mYUNob2ljZXNGcm9tKHRoaXMuc2V0dGluZ3MoKT8uYWNjb3VudCk7XG4gIH1cblxuICAvKiogU3RhcnQgdGhlIGVucm9sbWVudCBzdGVwIGZvciBpdHMgYXR0ZW1wdCwgb3IgcmVzZXQgaXQgb25jZSB0aGUgZmxvdyBsZWF2ZXMuICovXG4gIHByaXZhdGUgc3luY0Vucm9sbG1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0O1xuICAgIGlmIChhdHRlbXB0Py5zdGF0dXMgPT09ICduZWVkc19tZmFfZW5yb2xsbWVudCcgJiYgYXR0ZW1wdC5pZCkgdGhpcy5lbnJvbGxtZW50LnN0YXJ0KGF0dGVtcHQuaWQpO1xuICAgIGVsc2UgdGhpcy5lbnJvbGxtZW50LnJlc2V0KCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIGluc3RhbmNlJ3MgcHVibGljIHNldHRpbmdzIGFuZCBkcmF3IHdoYXRldmVyIGNhcHRjaGEgdGhleSByZXF1aXJlLiAqL1xuICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgZmV0Y2hJbnN0YW5jZVNldHRpbmdzKHRoaXMuY2xpZW50KTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnNldChsb2FkZWQpO1xuICAgICAgdGhpcy5zeW5jQ2FwdGNoYSgpO1xuICAgICAgaWYgKGxvYWRlZC5hY2NvdW50Lmxhc3RTaWduSW5NZXRob2QpIHRoaXMubGFzdE1ldGhvZC5zZXQoYXdhaXQgZmV0Y2hMYXN0U2lnbkluTWV0aG9kKHRoaXMuY2xpZW50KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3JzIHRvIG9mZmVyIG9uIGEgYG5lZWRzX2ZpcnN0X2ZhY3RvcmAgc3RlcDogdGhlIHNlcnZlcidzIGxpc3RcbiAgICogd2l0aG91dCBlbWFpbCBjb2RlIC8gbGluayB3aGlsZSB0aGUgYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsXG4gICAqIChgc2V0dGluZ3MuZW1haWxEZWxpdmVyeS5hdmFpbGFibGUgPT09IGZhbHNlYCkuIEVtcHR5IG9uIGFueSBvdGhlciBzdGVwLlxuICAgKi9cbiAgZmlyc3RGYWN0b3JzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ7XG4gICAgY29uc3Qgc3RlcCA9IGF0dGVtcHQgPyBuZXh0U3RlcChhdHRlbXB0KSA6IG51bGw7XG4gICAgaWYgKHN0ZXA/LmtpbmQgIT09ICdjb2xsZWN0X2ZpcnN0X2ZhY3RvcicpIHJldHVybiBbXTtcbiAgICBjb25zdCBvZmZlcmVkID0gb2ZmZXJlZEZpcnN0RmFjdG9ycyhzdGVwLnN0cmF0ZWdpZXMsIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeSk7XG4gICAgY29uc3QgcHJvb2YgPSB0aGlzLmhvbGRQcm9vZigpO1xuICAgIHJldHVybiBwcm9vZiAmJiAhb2ZmZXJlZC5pbmNsdWRlcyhwcm9vZikgPyBbLi4ub2ZmZXJlZCwgcHJvb2ZdIDogb2ZmZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW1haWxlZCBwcm9vZiBhIHBhc3N3b3JkIGhvbGQgc3RpbGwgd2FpdHMgb24gKGBGbG93U3RhdGUucGFzc3dvcmRIb2xkYCk6IHRoZVxuICAgKiBjb2RlLCBvciBhIGxpbmsgd2hlcmUgdGhlIGluc3RhbmNlIHZlcmlmaWVzIGJ5IGxpbmsgb25seS4gTnVsbCB3aXRoIG5vIGhvbGQsIG9uY2VcbiAgICogcHJvdmVuLCBvciB3aGlsZSB0aGUgYXBwIGNhbm5vdCBkZWxpdmVyIGVtYWlsLlxuICAgKi9cbiAgaG9sZFByb29mKCk6ICdlbWFpbF9jb2RlJyB8ICdlbWFpbF9saW5rJyB8IG51bGwge1xuICAgIGNvbnN0IGhvbGQgPSB0aGlzLnN0YXRlKCkucGFzc3dvcmRIb2xkO1xuICAgIGlmICghaG9sZCB8fCBob2xkLnJlbGVhc2VkIHx8IHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeT8uYXZhaWxhYmxlID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uYWNjb3VudD8uZW1haWxWZXJpZmljYXRpb24gPT09ICdsaW5rJyA/ICdlbWFpbF9saW5rJyA6ICdlbWFpbF9jb2RlJztcbiAgfVxuXG4gIC8qKiBCYWNrIGZyb20gdGhlIGVtYWlsZWQgZmFjdG9yIHRvIHRoZSBwYXNzd29yZCBmaWVsZC4gKi9cbiAgdXNlUGFzc3dvcmQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHByZXBhcmVkOiBudWxsLCBwb2xsU2VjcmV0OiBudWxsLCBlcnJvcnM6IFtdIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gZW1haWwgKyBwYXNzd29yZCBzaWduLXVwIGNhbm5vdCBjb21wbGV0ZSBiZWNhdXNlIHRoZSBhcHAgY2Fubm90XG4gICAqIHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlYCk6XG4gICAqIGA8YXRsYXMtc2lnbi11cD5gIHNob3dzIHRoZSBcImNhbid0IHNlbmQgZW1haWxcIiBub3RpY2UgaW5zdGVhZCBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHNpZ25VcEVtYWlsVW5hdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeS5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICAvKiogRmFsc2Ugd2hlbiBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIGNhbm5vdCBiZSBkZWxpdmVyZWQg4oCUIGhpZGUgXCJGb3Jnb3QgcGFzc3dvcmQ/XCIuICovXG4gIHBhc3N3b3JkUmVzZXRBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MoKT8uZW1haWxEZWxpdmVyeS5wYXNzd29yZFJlc2V0ICE9PSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgdGhlIHNlcnZlciB0byBlbWFpbCBhIHNpZ24taW4gY29kZSBmb3IgdGhlIGN1cnJlbnQgYG5lZWRzX2ZpcnN0X2ZhY3RvcmBcbiAgICogc3RlcCAoYFBPU1Qg4oCmL3ByZXBhcmVfZmlyc3RfZmFjdG9yYCk7IHRoZSBmb3JtIHRoZW4gY29sbGVjdHMgdGhlIGNvZGUsIHdoaWNoXG4gICAqIHtAbGluayBzdWJtaXR9IHBvc3RzIGFzIHRoZSBgZW1haWxfY29kZWAgc3RyYXRlZ3kuIFdoaWxlIGEgcGFzc3dvcmQgaG9sZCB3YWl0c1xuICAgKiBvbiBpdCAoe0BsaW5rIGhvbGRQcm9vZn0pLCB0aGlzIGVtYWlscyB0aGF0IHByb29mIGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlKHN0cmF0ZWd5OiAnZW1haWxfY29kZScgfCAnZW1haWxfbGluaycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZmlyc3RGYWN0b3JzKCkuaW5jbHVkZXMoc3RyYXRlZ3kpKSByZXR1cm47XG4gICAgY29uc3QgcHJvb2YgPSB0aGlzLmhvbGRQcm9vZigpO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID1cbiAgICAgIHN0cmF0ZWd5ID09PSBwcm9vZlxuICAgICAgICA/IGF3YWl0IHByZXBhcmVQYXNzd29yZEhvbGRQcm9vZih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpLCBwcm9vZilcbiAgICAgICAgOiBhd2FpdCBwcmVwYXJlRmFjdG9yKHRoaXMuY2xpZW50LCB0aGlzLnN0YXRlKCksIHN0cmF0ZWd5KTtcbiAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgIGlmICghbmV4dC5lcnJvcnMubGVuZ3RoKSB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChzdHJhdGVneSk7XG4gICAgdGhpcy5zeW5jUG9sbGluZygpO1xuICB9XG5cbiAgLyoqIEtlZXAgYm90aCBjYXB0Y2hhcyBpbiBzdGVwIHdpdGggdGhlIHNldHRpbmdzIGFuZCB0aGUgZmxvdydzIGN1cnJlbnQgc3RlcC4gKi9cbiAgcHJpdmF0ZSBzeW5jQ2FwdGNoYSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICB0aGlzLmNhcHRjaGEuY29uZmlndXJlKFxuICAgICAgc2lnbkluQ2FwdGNoYU9wdGlvbnMoc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduSW4sIHN0YXRlLCAoKSA9PiB2b2lkIHRoaXMuc3VibWl0KHt9KSksXG4gICAgKTtcbiAgICBjb25zdCBzaWduVXBGbG93ID0gc2V0dGluZ3M/LmNhcHRjaGFGbG93cy5zaWduVXA7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmNvbmZpZ3VyZSh7XG4gICAgICBmbG93OiBzaWduVXBGbG93LFxuICAgICAgYWN0aXZlOiAhc3RhdGUuYXR0ZW1wdCAmJiBmbG93TmVlZHNDYXB0Y2hhKHNpZ25VcEZsb3cpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FwdGNoYURyYXduLnNldCh0aGlzLmNhcHRjaGEubmVlZGVkKTtcbiAgICB0aGlzLnNpZ25VcENhcHRjaGFEcmF3bi5zZXQodGhpcy5zaWduVXBDYXB0Y2hhLm5lZWRlZCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXRlKG5leHQ6IEZsb3dTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzSWQgPSBwcmV2aW91cy5hdHRlbXB0Py5pZCA/PyBudWxsO1xuICAgIHRoaXMuc3RhdGUuc2V0KG5leHQpO1xuICAgIC8vIEEgcHJvdmVuIGhvbGQgZ29lcyBiYWNrIHRvIHRoZSBwYXNzd29yZCBmaWVsZC5cbiAgICBpZiAobmV4dC5wYXNzd29yZEhvbGQ/LnJlbGVhc2VkICYmICFwcmV2aW91cy5wYXNzd29yZEhvbGQ/LnJlbGVhc2VkKSB0aGlzLnByZXBhcmVkRmFjdG9yLnNldChudWxsKTtcbiAgICAvLyBBIHByZXBhcmVkIGZhY3RvciBiZWxvbmdzIHRvIHRoZSBmaXJzdC1mYWN0b3Igc3RlcCBpdCB3YXMgc2VudCBmb3IuXG4gICAgaWYgKG5leHQuYXR0ZW1wdD8uc3RhdHVzICE9PSAnbmVlZHNfZmlyc3RfZmFjdG9yJykgdGhpcy5wcmVwYXJlZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgLy8gQW4gZW1haWxlZCBzZWNvbmQtZmFjdG9yIGNvZGUgYmVsb25ncyB0byB0aGUgc2Vjb25kLWZhY3RvciBzdGVwIG9mIHRoaXMgYXR0ZW1wdC5cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgIT09ICduZWVkc19zZWNvbmRfZmFjdG9yJyB8fCAobmV4dC5hdHRlbXB0Py5pZCA/PyBudWxsKSAhPT0gcHJldmlvdXNJZCkge1xuICAgICAgdGhpcy5lbWFpbFNlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNtc1NlY29uZEZhY3Rvci5zZXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMuc3luY0NhcHRjaGEoKTtcbiAgICB0aGlzLnN5bmNFbnJvbGxtZW50KCk7XG4gICAgdGhpcy5hdXRvU2VuZCgpO1xuICAgIHRoaXMuYXV0b1NlbmRPbmx5V2F5KCk7XG4gIH1cblxuICBwcml2YXRlIGF1dG9TZW50Rm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvbmx5V2F5Rm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9uY2UgcGVyIGF0dGVtcHQsIG9uIGFycml2YWwgYXQgdGhlIHNlY29uZCBmYWN0b3I6IGVtYWlsIHRoZSBjb2RlIGlmIHRoZSBpbmJveCBpcyB0aGUgb25seSB3YXkuICovXG4gIHByaXZhdGUgYXV0b1NlbmRPbmx5V2F5KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgYXR0ZW1wdCB9ID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IGlkID0gYXR0ZW1wdD8uaWQgPz8gbnVsbDtcbiAgICBpZiAoIWlkIHx8IGF0dGVtcHQ/LnN0YXR1cyAhPT0gJ25lZWRzX3NlY29uZF9mYWN0b3InIHx8IHRoaXMub25seVdheUZvciA9PT0gaWQgfHwgIXRoaXMubWZhQ2hvaWNlcygpLmVtYWlsQ29kZSkgcmV0dXJuO1xuICAgIHRoaXMub25seVdheUZvciA9IGlkO1xuICAgIHZvaWQgc2VuZE9ubHlXYXlTZWNvbmRGYWN0b3JDb2RlKHRoaXMuY2xpZW50LCBpZCkudGhlbigoc2VudFRvKSA9PiB7XG4gICAgICAvLyBBIHN0YWxlIGFuc3dlciAodGhlIGZsb3cgbW92ZWQgdG8gYW5vdGhlciBhdHRlbXB0KSBpcyBkcm9wcGVkLlxuICAgICAgaWYgKHNlbnRUbyAmJiB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQgPT09IGlkKSB0aGlzLmVtYWlsU2Vjb25kRmFjdG9yLnNldCh7IHNlbnRUbyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBcIlVzZSBhIHBhc3NrZXlcIiBhdCB0aGUgc2Vjb25kIGZhY3RvcjogbGVhdmVzIGZvciB0aGUgaG9zdGVkIHBhZ2UuICovXG4gIGNvbnRpbnVlV2l0aFBhc3NrZXkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlKCkuYXR0ZW1wdD8uaWQ7XG4gICAgcmV0dXJuICEhaWQgJiYgY29udGludWVPbkhvc3RlZFBhZ2UodGhpcy5tZmFDaG9pY2VzKCksIGlkLCAnbmVlZHNfc2Vjb25kX2ZhY3RvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbm8gcGFzc3dvcmQgb24gb2ZmZXIsIGVtYWlsIHRoZSBjb2RlIGFzIHNvb24gYXMgdGhlIHNlcnZlciBhc2tzIGZvciBhXG4gICAqIGZpcnN0IGZhY3RvciDigJQgb25jZSBwZXIgYXR0ZW1wdCwgc28gYSBmYWlsZWQgc2VuZCB3YWl0cyBmb3IgdGhlIHVzZXIncyByZXRyeVxuICAgKiAodGhlIFwiRW1haWwgbWUgYSBjb2RlXCIgYnV0dG9uKSBpbnN0ZWFkIG9mIGxvb3BpbmcuXG4gICAqL1xuICBwcml2YXRlIGF1dG9TZW5kKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZSgpLmF0dGVtcHQ/LmlkID8/IG51bGw7XG4gICAgaWYgKCFpZCB8fCB0aGlzLmF1dG9TZW50Rm9yID09PSBpZCB8fCB0aGlzLnByZXBhcmVkRmFjdG9yKCkpIHJldHVybjtcbiAgICBpZiAocGxhbkZpcnN0RmFjdG9yKHRoaXMuZmlyc3RGYWN0b3JzKCkpLmF1dG9TZW5kICE9PSAnZW1haWxfY29kZScpIHJldHVybjtcbiAgICB0aGlzLmF1dG9TZW50Rm9yID0gaWQ7XG4gICAgdm9pZCB0aGlzLnByZXBhcmUoJ2VtYWlsX2NvZGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBmbG93IHdpdGggdGhlIHZhbHVlcyB0aGUgdXNlciB0eXBlZC4gT24gY29tcGxldGlvbiwgZXhjaGFuZ2UgdGhlXG4gICAqIG9uZS10aW1lIHRpY2tldCBmb3IgY29va2llcyBvdmVyIGEgc2FtZS1vcmlnaW4gcmVxdWVzdCAoRkFQSSBpcyBjcm9zcy1vcmlnaW5cbiAgICogYW5kIGNhbm5vdCBzZXQgdGhlIGNvb2tpZSBvbiBpdHMgb3duIHJlc3BvbnNlKSwgdGhlbiByZS1ib290IHNvIHRoZSByZXN0IG9mXG4gICAqIHRoZSBhcHAgc2VlcyBhIHNpZ25lZC1pbiB1c2VyLlxuICAgKi9cbiAgYXN5bmMgc3VibWl0KHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcblxuICAgIC8vIEEgY29kZSB0aGF0IGxpZnRzIGEgcGFzc3dvcmQgaG9sZCBnb2VzIHRvIGl0cyBvd24gYXR0ZW1wdCwgbm90IHRoaXMgc2lnbi1pbi5cbiAgICBpZiAodGhpcy5wcmVwYXJlZEZhY3RvcigpID09PSAnZW1haWxfY29kZScgJiYgdGhpcy5ob2xkUHJvb2YoKSA9PT0gJ2VtYWlsX2NvZGUnKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGF3YWl0IGF0dGVtcHRQYXNzd29yZEhvbGRQcm9vZih0aGlzLmNsaWVudCwgdGhpcy5zdGF0ZSgpLCB2YWx1ZXMuY29kZSA/PyAnJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSBhd2FpdCBhZHZhbmNlV2l0aENhcHRjaGEodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgdmFsdWVzLCB7XG4gICAgICBjYXB0Y2hhOiB0aGlzLmNhcHRjaGEsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgfSk7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gb3V0LmlkZW50aWZpZXI7XG4gICAgYXdhaXQgdGhpcy5maW5pc2gob3V0LnN0YXRlKTtcbiAgfVxuXG4gIC8qKiBMb2FkIHRoZSBzaWduLXVwJ3MgcG9saWNpZXMgaW50byB7QGxpbmsgcG9saWNpZXN9IChgPGF0bGFzLXNpZ24tdXA+YCBjYWxscyBpdCBvbiBpbml0KS4gKi9cbiAgYXN5bmMgbG9hZFBvbGljaWVzKGxvY2FsZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucG9saWNpZXMuc2V0UG9saWNpZXMoYXdhaXQgbG9hZFBvbGljaWVzKHRoaXMuY2xpZW50LCB7IGxvY2FsZSB9KSk7XG4gIH1cblxuICAvKiogVGhlIHVzZXIgZGVjbGluZWQgYSBwb2xpY3kgYSBzaWduLWluIHdhcyB3YWl0aW5nIG9uOiBjYW5jZWwgdGhlIGF0dGVtcHQgYW5kIHNheSB3aHkuICovXG4gIGRlY2xpbmVQb2xpY3kodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuc2V0KHtcbiAgICAgIC4uLmluaXRpYWxGbG93LFxuICAgICAgZXJyb3JzOiBbeyBjb2RlOiAnUE9MSUNZX0RFQ0xJTkVEJywgbWVzc2FnZTogdGhpcy50KCdwb2xpY3kuZGVjbGluZWQnKS5yZXBsYWNlKCd7cG9saWN5fScsIHRpdGxlKSB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYWNjb3VudCAoYFBPU1QgL3YxL2NsaWVudC9zaWduX3Vwc2ApIGZyb20gYSBjcmVhdGUtYWNjb3VudCBmb3JtJ3NcbiAgICogdmFsdWVzIOKAlCBlbWFpbCwgcGFzc3dvcmQgYW5kIGFueSBjb25maWd1cmVkIHNpZ24tdXAgZmllbGRzIOKAlCBjYXJyeWluZyB0aGVcbiAgICogc2lnbi11cCBjYXB0Y2hhJ3MgdG9rZW4gd2hlbiB0aGUgaW5zdGFuY2UgcmVxdWlyZXMgb25lLiBUaGUgZW1haWxlZCBjb2RlIGlzXG4gICAqIHRoZW4gcG9zdGVkIHdpdGgge0BsaW5rIHN1Ym1pdH0uXG4gICAqL1xuICBhc3luYyBjcmVhdGUodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBjb25zdCBuZXh0ID0gYXdhaXQgY3JlYXRlU2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHtcbiAgICAgIGNvbnNlbnQsXG4gICAgICBjYXB0Y2hhOiB0aGlzLnNpZ25VcENhcHRjaGEsXG4gICAgICB0OiB0aGlzLnQsXG4gICAgICBwb2xpY2llczogdGhpcy5wb2xpY2llcyxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIkVtYWlsIG1lIGEgY29kZSBpbnN0ZWFkXCIgYXQgdGhlIHNlY29uZCBmYWN0b3IgKHRoZSBpbnN0YW5jZSdzXG4gICAqIGBhY2NvdW50LmVtYWlsU2Vjb25kRmFjdG9yYCk6IG1haWxzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIHZlcmlmaWVkIGVtYWlsO1xuICAgKiBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEVtYWlsU2Vjb25kRmFjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZFNlY29uZEZhY3RvckNvZGUoJ2VtYWlsX2NvZGUnLCB0aGlzLmVtYWlsU2Vjb25kRmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlRleHQgbWUgYSBjb2RlIGluc3RlYWRcIiBhdCB0aGUgc2Vjb25kIGZhY3RvciAod2hlcmUgdGhlIGFwcCBvZmZlcnMgdGV4dGVkXG4gICAqIGNvZGVzLCB7QGxpbmsgbWZhQ2hvaWNlc31gKCkuc21zYCk6IHRleHRzIGEgY29kZSB0byB0aGUgYWNjb3VudCdzIGVucm9sbGVkXG4gICAqIHBob25lOyBpdCBpcyB0aGVuIHBvc3RlZCB3aXRoIHtAbGluayBzdWJtaXR9IGxpa2UgYW55IDJGQSBjb2RlLlxuICAgKi9cbiAgYXN5bmMgc2VuZFNtc1NlY29uZEZhY3RvcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRTZWNvbmRGYWN0b3JDb2RlKCdzbXMnLCB0aGlzLnNtc1NlY29uZEZhY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRTZWNvbmRGYWN0b3JDb2RlKFxuICAgIHN0cmF0ZWd5OiAnc21zJyB8ICdlbWFpbF9jb2RlJyxcbiAgICBvdXQ6IFdyaXRhYmxlU2lnbmFsPHsgYnVzeT86IGJvb2xlYW47IHNlbnRUbz86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGUoKS5hdHRlbXB0Py5pZDtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgb3V0LnNldCh7IGJ1c3k6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc2VudFRvIH0gPSBhd2FpdCBwcmVwYXJlU2Vjb25kRmFjdG9yQ29kZSh0aGlzLmNsaWVudCwgaWQsIHN0cmF0ZWd5KTtcbiAgICAgIG91dC5zZXQoeyBzZW50VG8gfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG91dC5zZXQoeyBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiB0aGlzLnQoJ2Vycm9yLmdlbmVyaWMnKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzZW5kIGEgc2lnbi11cCdzIGVtYWlsZWQgY29kZSAvIGxpbmsgKHRoZSBlYXJsaWVyIG9uZSBzdG9wcyB3b3JraW5nKS4gKi9cbiAgYXN5bmMgcmVzZW5kU2lnblVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICB0aGlzLnN0YXRlLnNldChhd2FpdCByZXNlbmRTaWduVXBWZXJpZmljYXRpb24odGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgcGFzc2tleS1vbmx5IHNpZ24tdXAgKGBQT1NUIC92MS9jbGllbnQvc2lnbl91cHMvcGFzc2tleWApIGZyb20gdGhlXG4gICAqIGNyZWF0ZS1hY2NvdW50IGZvcm0ncyB2YWx1ZXMg4oCUIG5vIHBhc3N3b3JkLiBPZmZlcmVkIHdoZW4gdGhlIGluc3RhbmNlJ3NcbiAgICogYGFjY291bnQucGFzc2tleVNpZ25VcGAgaXMgc2V0LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2l0aFBhc3NrZXkodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25zZW50ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBidXN5OiB0cnVlLCBlcnJvcnM6IFtdIH0pKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhd2FpdCBjcmVhdGVQYXNza2V5U2lnblVwKHRoaXMuY2xpZW50LCB2YWx1ZXMsIHsgY29uc2VudCwgY2FwdGNoYTogdGhpcy5zaWduVXBDYXB0Y2hhLCB0OiB0aGlzLnQsIHBvbGljaWVzOiB0aGlzLnBvbGljaWVzIH0pKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGFzc2tleS1vbmx5IHNpZ24tdXAncyBsYXN0IHN0ZXA6IGNyZWF0ZSB0aGUgcGFzc2tleSwgYW5kIHdpdGggaXQgdGhlIGFjY291bnQuICovXG4gIGFzeW5jIGNyZWF0ZVBhc3NrZXkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGJ1c3k6IHRydWUsIGVycm9yczogW10gfSkpO1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGF3YWl0IGZpbmlzaFBhc3NrZXlTaWduVXAodGhpcy5jbGllbnQsIHRoaXMuc3RhdGUoKSwgeyB0OiB0aGlzLnQgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb2RlcyBhbiBNRkEgZW5yb2xtZW50IGp1c3QgY29tcGxldGVkIHRoZSBzaWduLWluIHdpdGgsIHNob3duXG4gICAqIG9uY2UgYmVmb3JlIGl0IGZpbmlzaGVzICh7QGxpbmsgc2F2ZVJlY292ZXJ5Q29kZXN9KTsgbnVsbCBvdGhlcndpc2UuIFRoZXlcbiAgICogbGl2ZSBvbmx5IGluIHRoaXMgY29udHJvbGxlcidzIG1lbW9yeS5cbiAgICovXG4gIHJlY292ZXJ5Q29kZXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gcGVuZGluZ1JlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIC8qKiBcIkkndmUgc2F2ZWQgbXkgY29kZXNcIjogZm9yZ2V0IHRoZSByZWNvdmVyeSBjb2RlcyBhbmQgZmluaXNoIHRoZSBzaWduLWluLiAqL1xuICBhc3luYyBzYXZlUmVjb3ZlcnlDb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaChhY2tub3dsZWRnZVJlY292ZXJ5Q29kZXModGhpcy5zdGF0ZSgpKSk7XG4gIH1cblxuICAvKiogVGhlIGFkZHJlc3MgYmVsb25nZWQgdG8gYW4gZXhpc3RpbmcgYWNjb3VudDogdGhlIG5vdGljZSBpcyB1cCB1bnRpbCB7QGxpbmsgY29udGludWVBZnRlckV4aXN0aW5nQWNjb3VudH0uICovXG4gIGV4aXN0aW5nQWNjb3VudE5vdGljZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGVuZGluZ0V4aXN0aW5nQWNjb3VudE5vdGljZSh0aGlzLnN0YXRlKCkpO1xuICB9XG5cbiAgLyoqIFRoZSB1c2VyIHJlYWQgdGhlIG5vdGljZTogZmluaXNoIHRoZSBzaWduLXVwLiAqL1xuICBhc3luYyBjb250aW51ZUFmdGVyRXhpc3RpbmdBY2NvdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmluaXNoKGFja25vd2xlZGdlRXhpc3RpbmdBY2NvdW50KHRoaXMuc3RhdGUoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2gobmV4dDogRmxvd1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW4gZW5yb2xtZW50J3MgcmVjb3ZlcnkgY29kZXMgYXJlIHNob3duIGZpcnN0OyBgc2F2ZVJlY292ZXJ5Q29kZXNgIGZpbmlzaGVzLlxuICAgIGlmIChwZW5kaW5nUmVjb3ZlcnlDb2RlcyhuZXh0KSkge1xuICAgICAgLy8gVGhlIHRpY2tldCBkaWVzIGluIDYwIHNlY29uZHMgYW5kIHNhdmluZyB0aGUgY29kZXMgY2FuIHRha2UgbG9uZ2VyOiByZWRlZW0gaXQgbm93LFxuICAgICAgLy8gYW5kIGBzYXZlUmVjb3ZlcnlDb2Rlc2AgZmluaXNoZXMuIEEgcmVmdXNlZCBleGNoYW5nZSBrZWVwcyB0aGUgdGlja2V0LCBzbyB0aGUgc2F2ZSByZXBvcnRzIGl0LlxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IC4uLm5leHQsIGJ1c3k6IHRydWUgfSk7XG4gICAgICBjb25zdCByZXMgPSBuZXh0LnRpY2tldFxuICAgICAgICA/IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy92MS9jbGllbnQvdGlja2V0cy9leGNoYW5nZScsIHsgYXR0ZW1wdF9pZDogKG5leHQuYXR0ZW1wdCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkLCB0aWNrZXQ6IG5leHQudGlja2V0IH0pXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiBmYWxzZSwgdGlja2V0OiByZXM/Lm9rID8gbnVsbCA6IG5leHQudGlja2V0IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV4dC5hdHRlbXB0Py5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIC8vIFN0YXlzIGJ1c3kgdW50aWwgdGhpcyBicm93c2VyIGFjdHVhbGx5IGhvbGRzIHRoZSBzZXNzaW9uOiB0aGUgY29tcGxldGlvblxuICAgICAgLy8gYWxvbmUgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgdGhlIGNvb2tpZSB3YXMga2VwdC5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyAuLi5uZXh0LCBidXN5OiB0cnVlIH0pO1xuICAgICAgbGV0IGV4Y2hhbmdlZCA9IHRydWU7XG4gICAgICBpZiAobmV4dC50aWNrZXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICAgIGF0dGVtcHRfaWQ6IChuZXh0LmF0dGVtcHQgYXMgeyBpZD86IHN0cmluZyB9KS5pZCxcbiAgICAgICAgICB0aWNrZXQ6IG5leHQudGlja2V0LFxuICAgICAgICB9KTtcbiAgICAgICAgZXhjaGFuZ2VkID0gcmVzLm9rO1xuICAgICAgfVxuICAgICAgaWYgKGV4Y2hhbmdlZCAmJiB0aGlzLmhvbGRFeGlzdGluZ0FjY291bnROb3RpY2UgJiYgcGVuZGluZ0V4aXN0aW5nQWNjb3VudE5vdGljZShuZXh0KSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgdGlja2V0OiBudWxsLCBidXN5OiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qga2VwdCA9IGV4Y2hhbmdlZCAmJiAoYXdhaXQgdGhpcy5yZWxvYWQoKSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgLi4ubmV4dCwgYnVzeTogZmFsc2UsIHNlc3Npb25LZXB0OiBrZXB0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKG5leHQpO1xuICAgICAgLy8gQSBtYWdpYy1saW5rIHN0ZXAgbWF5IG5vdyBiZSBwb2xsYWJsZSAoYSBsaW5rIG9wZW5lZCBvbiBhbm90aGVyIGRldmljZSkuXG4gICAgICB0aGlzLnN5bmNQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0L3N0b3AgdGhlIMKnNS4zIG1hZ2ljLWxpbmsgcG9sbCB0byBtYXRjaCB0aGUgY3VycmVudCBzdGF0ZS4gKi9cbiAgc3luY1BvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZEtlZXBQb2xsaW5nKHRoaXMuc3RhdGUoKSkpIHtcbiAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHJldHVybjtcbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9sbGVkID0gdGhpcy5zdGF0ZSgpO1xuICAgICAgICBjb25zdCB7IHN0YXRlOiBuZXh0LCB0aWNrZXQgfSA9IGF3YWl0IHBvbGxBdHRlbXB0KHRoaXMuY2xpZW50LCBwb2xsZWQpO1xuICAgICAgICAvLyBBIHJlc2VuZCByb3RhdGVkIHRoZSBzZWNyZXQgbWVhbndoaWxlOiB0aGlzIGFuc3dlciBpcyBzdGFsZS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUoKS5wb2xsU2VjcmV0ID09PSBwb2xsZWQucG9sbFNlY3JldCkgdGhpcy5zZXRTdGF0ZShuZXh0KTtcbiAgICAgICAgLy8gZS5nLiBhIHBhc3NrZXkgc2lnbi11cCB3aG9zZSBlbWFpbCB3YXMganVzdCBwcm92ZW46IG9ubHkgdGhpcyB0YWIgY2FuIGdvIG9uLlxuICAgICAgICBpZiAoIXRpY2tldCAmJiAhc2hvdWxkS2VlcFBvbGxpbmcobmV4dCkpIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICAgICAgaWYgKCF0aWNrZXQgfHwgIW5leHQuYXR0ZW1wdCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFRoZSB0aWNrZXQgaXMgZXhjaGFuZ2VkIGJ5IGEgbm9ybWFsIHJlcXVlc3QsIHNvIG5vIHNlc3Npb24gdG9rZW4gZXZlclxuICAgICAgICAvLyBhcHBlYXJzIGluIGEgVVJMLlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0KCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgICAgYXR0ZW1wdF9pZDogKG5leHQuYXR0ZW1wdCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkLFxuICAgICAgICAgIHRpY2tldCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGtlcHQgPSByZXMub2sgJiYgKGF3YWl0IHRoaXMucmVsb2FkKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgLi4udGhpcy5zdGF0ZSgpLCBzZXNzaW9uS2VwdDoga2VwdCB9KTtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgfSkoKTtcbiAgICB9LCAyXzAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbGVhc2UgdGhlIHBvbGwgdGltZXIgYW5kIHRoZSBjYXB0Y2hhIHdpZGdldHMg4oCUIGNhbGwgZnJvbSB0aGUgY29tcG9uZW50J3MgYG5nT25EZXN0cm95YC4gKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhc3NrZXkuc3RvcEF1dG9maWxsKCk7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIHRoaXMuY2FwdGNoYS5kZXN0cm95KCk7XG4gICAgdGhpcy5zaWduVXBDYXB0Y2hhLmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
|