cdk-serverless 3.5.0 → 3.5.1

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.
@@ -168,10 +168,14 @@ to use any other JWT-based authorization service.</p>
168
168
  <div class="tsd-comment tsd-typography"><p>If true, addLambdaResolver synthesizes an APPSYNC_JS pipeline resolver whose
169
169
  response handler converts the errors.appsync.* envelope returned by
170
170
  createAppSyncHandler into a typed GraphQL error.</p>
171
+ <p>Untyped errors still fail the invocation, and the pipeline function raises
172
+ them as GraphQL errors with AppSync's invoke error type (e.g.
173
+ <code>Lambda:Unhandled</code>), as a UNIT direct-Lambda resolver does.</p>
171
174
  <p>When false (the default), addLambdaResolver synthesizes a plain UNIT
172
- direct-Lambda resolver (the pre-#385 behavior) with no response handler. On
173
- that path, if a handler throws an AppSyncError the sentinel envelope is
174
- returned as field data instead of becoming a GraphQL error.</p>
175
+ direct-Lambda resolver (the pre-#385 behavior) with no response handler.
176
+ The Lambda gets no APPSYNC_TYPED_ERRORS flag, so createAppSyncHandler
177
+ rethrows an AppSyncError and AppSync reports it as <code>Lambda:Unhandled</code>
178
+ without the typed errorType and errorInfo.</p>
175
179
  <p>This flag applies to ALL Lambda resolvers on the API. Enabling it changes
176
180
  the resolver topology from UNIT to PIPELINE, which produces a cdk diff for
177
181
  every Lambda resolver, so opt in deliberately.</p>
@@ -27,10 +27,15 @@ export interface GraphQlApiProps extends BaseApiProps {
27
27
  * response handler converts the errors.appsync.* envelope returned by
28
28
  * createAppSyncHandler into a typed GraphQL error.
29
29
  *
30
+ * Untyped errors still fail the invocation, and the pipeline function raises
31
+ * them as GraphQL errors with AppSync's invoke error type (e.g.
32
+ * `Lambda:Unhandled`), as a UNIT direct-Lambda resolver does.
33
+ *
30
34
  * When false (the default), addLambdaResolver synthesizes a plain UNIT
31
- * direct-Lambda resolver (the pre-#385 behavior) with no response handler. On
32
- * that path, if a handler throws an AppSyncError the sentinel envelope is
33
- * returned as field data instead of becoming a GraphQL error.
35
+ * direct-Lambda resolver (the pre-#385 behavior) with no response handler.
36
+ * The Lambda gets no APPSYNC_TYPED_ERRORS flag, so createAppSyncHandler
37
+ * rethrows an AppSyncError and AppSync reports it as `Lambda:Unhandled`
38
+ * without the typed errorType and errorInfo.
34
39
  *
35
40
  * This flag applies to ALL Lambda resolvers on the API. Enabling it changes
36
41
  * the resolver topology from UNIT to PIPELINE, which produces a cdk diff for
@@ -324,9 +324,16 @@ export function request(ctx) {
324
324
  };
325
325
  }
326
326
 
327
- // Pass the Lambda result through unchanged; the resolver response handler
328
- // converts the error envelope into a GraphQL error.
327
+ // A failed invoke (an untyped error rethrown by createAppSyncHandler, a timeout,
328
+ // a missing permission) lands in this function's ctx.error. AppSync drops it
329
+ // unless this handler raises it, and the field would resolve to null with no
330
+ // GraphQL error. Raise it with the same message and type a UNIT direct-Lambda
331
+ // resolver reports. Otherwise pass the result through; the resolver response
332
+ // handler converts the typed error envelope into a GraphQL error.
329
333
  export function response(ctx) {
334
+ if (ctx.error) {
335
+ util.error(ctx.error.message, ctx.error.type);
336
+ }
330
337
  return ctx.result;
331
338
  }
332
339
  `),
@@ -352,11 +359,10 @@ export function request(ctx) {
352
359
  // createAppSyncHandler stamps. Branching on the sentinel (not on a bare
353
360
  // errorMessage) means a legitimate result that merely has an errorMessage field
354
361
  // is returned unchanged instead of being misread as a typed error.
362
+ //
363
+ // Invoke-level errors are raised by the pipeline function itself: an error left
364
+ // in a function's ctx.error never reaches this handler's ctx.error.
355
365
  export function response(ctx) {
356
- if (ctx.error) {
357
- util.appendError(ctx.error.message, ctx.error.type, ctx.result);
358
- return ctx.result;
359
- }
360
366
  const result = ctx.prev.result;
361
367
  if (result && result.__appSyncError) {
362
368
  util.error(result.errorMessage, result.errorType, null, result.errorInfo);
@@ -589,4 +595,4 @@ function exec(cmd, args, options) {
589
595
  }
590
596
  return proc;
591
597
  }
592
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2dyYXBocWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLGlEQUE0RDtBQUM1RCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLDZDQUE2TDtBQUc3TCx5Q0FBbUQ7QUFDbkQsaUNBQXdDO0FBQ3hDLCtDQUF5RTtBQXdHekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsVUFBc0IsU0FBUSxrQkFBTztJQTRCaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBbUIsS0FBc0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFEaUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUF2QmpGOztXQUVHO1FBQ0ssZUFBVSxHQUE4QyxFQUFFLENBQUM7UUFFbkU7OztXQUdHO1FBQ2MsaUJBQVksR0FBd0MsRUFBRSxDQUFDO1FBaUJ0RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUF1QyxDQUFDO1FBRWpFLElBQUksZ0JBQXVELENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsZ0JBQWdCLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDeEIsV0FBVyxFQUFFLElBQUksb0NBQXNCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDNUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFXO29CQUM1QixNQUFNLEVBQUUsV0FBVztvQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUN4QixVQUFVLEVBQUUsb0NBQXNCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxV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bWF4LWxlbiAqL1xuaW1wb3J0IHsgU3Bhd25TeW5jT3B0aW9ucywgc3Bhd25TeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgQXNzZXRIYXNoVHlwZSwgQnVuZGxpbmdPcHRpb25zLCBCdW5kbGluZ091dHB1dCwgQ2ZuT3V0cHV0LCBEb2NrZXJJbWFnZSwgTmVzdGVkU3RhY2ssIFRhZ3MsIGF3c19hcHBzeW5jLCBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLCBhd3NfaWFtLCBhd3NfbG9ncywgYXdzX3JvdXRlNTMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvZ25pdG9BdXRoZW50aWNhdGlvbiB9IGZyb20gJy4vYXV0aGVudGljYXRpb24nO1xuaW1wb3J0IHsgQmFzZUFwaSwgQmFzZUFwaVByb3BzIH0gZnJvbSAnLi9iYXNlLWFwaSc7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gJy4vZnVuYyc7XG5pbXBvcnQgeyBDRk5fT1VUUFVUX1NVRkZJWF9HUkFQSFFMX0RPTUFJTk5BTUUgfSBmcm9tICcuLi9zaGFyZWQvb3V0cHV0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhRbEFwaVByb3BzIGV4dGVuZHMgQmFzZUFwaVByb3BzIHtcbiAgZGVmaW5pdGlvbkZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHJlc29sdmVycyBhbmQgTGFtYmRhIGZ1bmN0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgaW4gbmVzdGVkIHN0YWNrc1xuICAgKiBncm91cGVkIGJ5IHR5cGUgKFF1ZXJ5LCBNdXRhdGlvbiwgU3Vic2NyaXB0aW9uLCBGaWVsZCkuXG4gICAqXG4gICAqIFdBUk5JTkc6IE9ubHkgZW5hYmxlIHRoaXMgaWYgeW91IGFyZSBhcHByb2FjaGluZyBvciBoaXR0aW5nIENsb3VkRm9ybWF0aW9uJ3NcbiAgICogNTAwIHJlc291cmNlIGxpbWl0LiBOZXN0ZWQgc3RhY2tzIGhhdmUgc2lnbmlmaWNhbnQgZG93bnNpZGVzOlxuICAgKiAtIFNsb3dlciBkZXBsb3ltZW50cyBkdWUgdG8gYWRkaXRpb25hbCBzdGFjayBvcGVyYXRpb25zXG4gICAqIC0gTW9yZSBjb21wbGV4IGRlYnVnZ2luZyBhbmQgZXJyb3IgdHJhY2luZ1xuICAgKiAtIEhhcmRlciB0byBuYXZpZ2F0ZSBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gY29uc29sZVxuICAgKiAtIENyb3NzLXN0YWNrIHJlZmVyZW5jZXMgYWRkIGNvbXBsZXhpdHlcbiAgICpcbiAgICogV0FSTklORzogQ2hhbmdpbmcgdGhpcyBzZXR0aW5nIG9uIGFuIGV4aXN0aW5nIHN0YWNrIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24uXG4gICAqIENsb3VkRm9ybWF0aW9uIGNhbm5vdCBhdXRvbWF0aWNhbGx5IG1vdmUgcmVzb3VyY2VzIGJldHdlZW4gc3RhY2tzLiBZb3UgbWF5IG5lZWRcbiAgICogdG8gZGVsZXRlIGFuZCByZWNyZWF0ZSByZXNvbHZlcnMsIG9yIHBlcmZvcm0gYSB0d28tc3RlcCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdXNlTmVzdGVkU3RhY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgYWRkTGFtYmRhUmVzb2x2ZXIgc3ludGhlc2l6ZXMgYW4gQVBQU1lOQ19KUyBwaXBlbGluZSByZXNvbHZlciB3aG9zZVxuICAgKiByZXNwb25zZSBoYW5kbGVyIGNvbnZlcnRzIHRoZSBlcnJvcnMuYXBwc3luYy4qIGVudmVsb3BlIHJldHVybmVkIGJ5XG4gICAqIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIGludG8gYSB0eXBlZCBHcmFwaFFMIGVycm9yLlxuICAgKlxuICAgKiBXaGVuIGZhbHNlICh0aGUgZGVmYXVsdCksIGFkZExhbWJkYVJlc29sdmVyIHN5bnRoZXNpemVzIGEgcGxhaW4gVU5JVFxuICAgKiBkaXJlY3QtTGFtYmRhIHJlc29sdmVyICh0aGUgcHJlLSMzODUgYmVoYXZpb3IpIHdpdGggbm8gcmVzcG9uc2UgaGFuZGxlci4gT25cbiAgICogdGhhdCBwYXRoLCBpZiBhIGhhbmRsZXIgdGhyb3dzIGFuIEFwcFN5bmNFcnJvciB0aGUgc2VudGluZWwgZW52ZWxvcGUgaXNcbiAgICogcmV0dXJuZWQgYXMgZmllbGQgZGF0YSBpbnN0ZWFkIG9mIGJlY29taW5nIGEgR3JhcGhRTCBlcnJvci5cbiAgICpcbiAgICogVGhpcyBmbGFnIGFwcGxpZXMgdG8gQUxMIExhbWJkYSByZXNvbHZlcnMgb24gdGhlIEFQSS4gRW5hYmxpbmcgaXQgY2hhbmdlc1xuICAgKiB0aGUgcmVzb2x2ZXIgdG9wb2xvZ3kgZnJvbSBVTklUIHRvIFBJUEVMSU5FLCB3aGljaCBwcm9kdWNlcyBhIGNkayBkaWZmIGZvclxuICAgKiBldmVyeSBMYW1iZGEgcmVzb2x2ZXIsIHNvIG9wdCBpbiBkZWxpYmVyYXRlbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlZEVycm9ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCwgYWRkTGFtYmRhUmVzb2x2ZXIgd2lyZXMgYW4gQXBwU3luYyBCYXRjaEludm9rZSByZXNvbHZlciBpbnN0ZWFkIG9mIGFcbiAgICogc2luZ2xlIGludm9rZS4gVGhlIGdlbmVyYXRlZCBVTklUIHJlc29sdmVyIGdldHMgTWF4QmF0Y2hTaXplIHNldCB0byB0aGlzXG4gICAqIHZhbHVlLCBhIEJhdGNoSW52b2tlIHJlcXVlc3QgdGVtcGxhdGVcbiAgICogKE1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXF1ZXN0KCckdXRpbHMudG9Kc29uKCRjb250ZXh0KScsICdCYXRjaEludm9rZScpKSBhbmRcbiAgICogYSBNYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVzdWx0KCkgcmVzcG9uc2UgdGVtcGxhdGUsIHNvIEFwcFN5bmMgZ3JvdXBzIHVwIHRvXG4gICAqIHRoaXMgbWFueSBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIG9uZSBMYW1iZGEgY2FsbC4gUGFpciB0aGlzIHdpdGhcbiAgICogY3JlYXRlQXBwU3luY0JhdGNoSGFuZGxlciwgd2hvc2UgaGFuZGxlciByZWNlaXZlcyB0aGUgYmF0Y2hlZCBldmVudHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBtYXhCYXRjaFNpemUgYW5kIGB0eXBlZEVycm9yc2AgYXJlIHNldCwgbWF4QmF0Y2hTaXplIHdpbnMgZm9yIHRoaXNcbiAgICogZmllbGQuIFRoZSBmaWVsZCBnZXRzIHRoZSBVTklUIEJhdGNoSW52b2tlIHJlc29sdmVyIHJhdGhlciB0aGFuIHRoZVxuICAgKiB0eXBlZEVycm9ycyBBUFBTWU5DX0pTIHBpcGVsaW5lLCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlc1xuICAgKiBoYXZlIG5vIGVxdWl2YWxlbnQgb24gdGhhdCBwaXBlbGluZS4gVHlwZWQgZXJyb3JzIHRocm93biBieSBhIGJhdGNoIGhhbmRsZXJcbiAgICogYXJlIG5vdCBjb252ZXJ0ZWQgdG8gR3JhcGhRTCBlcnJvcnMuIFRoZXkgcmV0aHJvdyBhbmQgZmFpbCB0aGUgaW52b2NhdGlvbixcbiAgICogc28gYSBiYXRjaCBoYW5kbGVyIHNob3VsZCBub3QgcmVseSBvbiB0aGUgdHlwZWQtZXJyb3ItdG8tR3JhcGhRTC1lcnJvclxuICAgKiBjb252ZXJzaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAoc2luZ2xlIGludm9rZSwgdGhlIHByZS1iYXRjaCBiZWhhdmlvdXI7IG5vIE1heEJhdGNoU2l6ZSBhbmQgbm8gbWFwcGluZyB0ZW1wbGF0ZXMpXG4gICAqL1xuICByZWFkb25seSBtYXhCYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnRsUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhc291cmNlIHRoZSBWVEwgcmVzb2x2ZXIgdGFyZ2V0c1xuICAgKi9cbiAgZGF0YVNvdXJjZTogYXdzX2FwcHN5bmMuQmFzZURhdGFTb3VyY2U7XG5cbiAgLyoqXG4gICAqIHN0cmluZyByZXBsYWNlbWVudHMgdG8gcHJvY2VzcyBvbiB0aGUgVlRMXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIHZhcmlhYmxlIGV4cGFuc2lvbnNcbiAgICovXG4gIHZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgcHV0IGludG8gdGhlIFwic3Rhc2hcIiBvZiB0aGUgcmVzb2x2ZXIgcGlwZWxpbmVcbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc3Rhc2hWYWx1ZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBuYW1lIG9mIHRoZSBwaXBlbGluZSBzdGVwcyB0byBjcmVhdGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBvbmx5IGEgZGVmYXVsdCBzdGVwIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVTdGVwTmFtZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpzUmVzb2x2ZXJDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHN0ZXBDb3VudDogbnVtYmVyO1xuICBlbnRyeUZpbGU6IHN0cmluZztcbiAgZnVuY3Rpb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdCBzZXRzIHVwIGFuIEFXUyBBcHBTeW5jIEdyYXBoUUwgQVBJIGludGVncmF0ZWQgd2l0aCBDb2duaXRvIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgRHluYW1vREIgZm9yIGRhdGEgc3RvcmFnZS5cbiAqIFRoaXMgY29uc3RydWN0IGZhY2lsaXRhdGVzIHRoZSBjcmVhdGlvbiBvZiBhIEdyYXBoUUwgQVBJIHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9ucywgaW5jbHVkaW5nIGN1c3RvbSBkb21haW4sIGxvZ2dpbmcsIHNjaGVtYSBkZWZpbml0aW9uLFxuICogYW5kIGF1dGhvcml6YXRpb24gdXNpbmcgQ29nbml0byBVc2VyIFBvb2wgYW5kIElkZW50aXR5IFBvb2wuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyB0byBkeW5hbWljYWxseSBhZGQgcmVzb2x2ZXJzIGFuZCBncmFudCBhY2Nlc3MgdG8gc3BlY2lmaWMgZmllbGRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBSRVNPTFZFUlMgLSBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgR3JhcGhRTCByZXNvbHZlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwaSA9IG5ldyBHcmFwaFFsQXBpKHRoaXMsICdNeUdyYXBoUWxBcGknLCB7XG4gKiAgIGFwaU5hbWU6ICdNeUFQSScsXG4gKiAgIHN0YWdlTmFtZTogJ2RldicsXG4gKiAgIGRlZmluaXRpb25GaWxlTmFtZTogJ3NjaGVtYS5ncmFwaHFsJyxcbiAqICAgYXV0aGVudGljYXRpb246IG15Q29nbml0b0F1dGgsXG4gKiAgIHNpbmdsZVRhYmxlRGF0YXN0b3JlOiBteUR5bmFtb0RCVGFibGUsXG4gKiB9KTtcbiAqXG4gKiAvLyBBZGQgYSBMYW1iZGEgcmVzb2x2ZXJcbiAqIGFwaS5hZGRMYW1iZGFSZXNvbHZlcignUXVlcnknLCAnZ2V0SXRlbScpO1xuICpcbiAqIC8vIEdyYW50IGFjY2VzcyB0byB1bmF1dGhlbnRpY2F0ZWQgdXNlcnMgZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAqIGFwaS5ncmFudEFjY2Vzc1VuQXV0aCgnUXVlcnknLCAnZ2V0SXRlbScpO1xuICovXG5leHBvcnQgY2xhc3MgR3JhcGhRbEFwaTxSRVNPTFZFUlM+IGV4dGVuZHMgQmFzZUFwaSB7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgQXBwU3luYyBHcmFwaFFMIEFQSSBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IGF3c19hcHBzeW5jLkdyYXBocWxBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBEeW5hbW9EQiBkYXRhIHNvdXJjZSBmb3IgdGhlIEdyYXBoUUwgQVBJLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlRGF0YVNvdXJjZT86IGF3c19hcHBzeW5jLkR5bmFtb0RiRGF0YVNvdXJjZTtcblxuICAvKipcbiAgICogQSBjb2xsZWN0aW9uIG9mIExhbWJkYSBmdW5jdGlvbnMgdXNlZCBhcyByZXNvbHZlcnMgZm9yIHRoZSBHcmFwaFFMIEFQSS5cbiAgICovXG4gIHByaXZhdGUgX2Z1bmN0aW9uczogeyBbb3BlcmF0aW9uSWQ6IHN0cmluZ106IExhbWJkYUZ1bmN0aW9uIH0gPSB7fTtcblxuICAvKipcbiAgICogTmVzdGVkIHN0YWNrcyBmb3IgcmVzb2x2ZXJzLCBncm91cGVkIGJ5IHR5cGUgbmFtZS5cbiAgICogT25seSB1c2VkIHdoZW4gdXNlTmVzdGVkU3RhY2tzIGlzIHRydWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrczogeyBbdHlwZU5hbWU6IHN0cmluZ106IE5lc3RlZFN0YWNrIH0gPSB7fTtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29nbml0b0F1dGg6IENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBHcmFwaFFsQXBpLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdGhpcyBjb25zdHJ1Y3QgaXMgZGVmaW5lZC5cbiAgICogQHBhcmFtIGlkIC0gVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEdyYXBoUWxBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jb2duaXRvQXV0aCA9IHByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAgIGxldCBjdXN0b21Eb21haW5OYW1lOiBhd3NfYXBwc3luYy5Eb21haW5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmFwaUZRRE4pIHtcbiAgICAgIGN1c3RvbURvbWFpbk5hbWUgPSB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgY2VydGlmaWNhdGU6IG5ldyBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlKHRoaXMsICdDZXJ0Jywge1xuICAgICAgICAgIGhvc3RlZFpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICBkb21haW5OYW1lOiB0aGlzLmFwaUZRRE4sXG4gICAgICAgICAgdmFsaWRhdGlvbjogYXdzX2NlcnRpZmljYXRlbWFuYWdlci5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsICdHcmFwaFFsQXBpRG9tYWluTmFtZScsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmFwaU5hbWV9JHtDRk5fT1VUUFVUX1NVRkZJWF9HUkFQSFFMX0RPTUFJTk5BTUV9YCxcbiAgICAgICAgdmFsdWU6IHRoaXMuYXBpRlFETixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYXBpID0gbmV3IGF3c19hcHBzeW5jLkdyYXBocWxBcGkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogYCR7cHJvcHMuYXBpTmFtZX0gWyR7cHJvcHMuc3RhZ2VOYW1lfV1gLFxuICAgICAgbG9nQ29uZmlnOiB7XG4gICAgICAgIGZpZWxkTG9nTGV2ZWw6IGF3c19hcHBzeW5jLkZpZWxkTG9nTGV2ZWwuQUxMLFxuICAgICAgICByZXRlbnRpb246IGF3c19sb2dzLlJldGVudGlvbkRheXMuVFdPX01PTlRIUyxcbiAgICAgIH0sXG4gICAgICBzY2hlbWE6IGF3c19hcHBzeW5jLlNjaGVtYUZpbGUuZnJvbUFzc2V0KHByb3BzLmRlZmluaXRpb25GaWxlTmFtZSksXG4gICAgICBkb21haW5OYW1lOiBjdXN0b21Eb21haW5OYW1lLFxuICAgICAgLi4udGhpcy5jb2duaXRvQXV0aCAmJiB7XG4gICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHtcbiAgICAgICAgICBhZGRpdGlvbmFsQXV0aG9yaXphdGlvbk1vZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb25UeXBlOiBhd3NfYXBwc3luYy5BdXRob3JpemF0aW9uVHlwZS5VU0VSX1BPT0wsXG4gICAgICAgICAgICAgIHVzZXJQb29sQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgdXNlclBvb2w6IHRoaXMuY29nbml0b0F1dGgudXNlcnBvb2wsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbjogYXdzX2FwcHN5bmMuVXNlclBvb2xEZWZhdWx0QWN0aW9uLkRFTlksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5jb2duaXRvQXV0aC5pZGVudGl0eVBvb2wgPyBbeyBhdXRob3JpemF0aW9uVHlwZTogYXdzX2FwcHN5bmMuQXV0aG9yaXphdGlvblR5cGUuSUFNIH1dIDogW10sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGN1c3RvbURvbWFpbk5hbWUgJiYgdGhpcy5hcGkuYXBwU3luY0RvbWFpbk5hbWUpIHtcbiAgICAgIG5ldyBhd3Nfcm91dGU1My5DbmFtZVJlY29yZCh0aGlzLCAnRG5zUmVjb3JkJywge1xuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUhLFxuICAgICAgICByZWNvcmROYW1lOiBjdXN0b21Eb21haW5OYW1lLmRvbWFpbk5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpLmFwcFN5bmNEb21haW5OYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKChwcm9wcy5tb25pdG9yaW5nID8/IHRydWUpICYmIHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgLy8gICAgIG5hbWVzcGFjZTogJ0FXUy9BcHBTeW5jJyxcbiAgICAvLyAgICAgbWV0cmljTmFtZTogJzVYWEVycm9yJyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnNFhYRXJyb3InLFxuICAgIC8vICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgLy8gICAgICAgR3JhcGhRTEFQSUlkOiB0aGlzLmFwaS5hcGlJZCxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdBdmVyYWdlJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTAnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTUnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTknLFxuICAgIC8vICAgfSkpO1xuICAgIC8vIH1cblxuICAgIGlmIChwcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuRHluYW1vRGJEYXRhU291cmNlKHRoaXMsICdTaW5nbGVUYWJsZVNvdXJjZScsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdGFibGU6IHByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlPy50YWJsZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIGdyYW50ZWU6IGF3c19pYW0uSUdyYW50YWJsZSxcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICAuLi5maWVsZE5hbWVzOiAoa2V5b2YgRklFTERUWVBFKVtdKTogdm9pZCB7XG4gICAgdGhpcy5hcGkuZ3JhbnQoZ3JhbnRlZSwgYXdzX2FwcHN5bmMuSWFtUmVzb3VyY2Uub2ZUeXBlKHR5cGVOYW1lIGFzIHN0cmluZywgLi4uZmllbGROYW1lcyBhcyBzdHJpbmdbXSksICdhcHBzeW5jOkdyYXBoUUwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzVW5BdXRoPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIC4uLmZpZWxkTmFtZXM6IChrZXlvZiBGSUVMRFRZUEUpW11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ3JhbnQgdG8gQ29nbml0byBpZGVudGl0eSBwb29sIGFzIG5vbmUgaXMgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgdGhpcy5ncmFudEFjY2Vzcyh0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbC51bmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHB1YmxpYyBncmFudEFjY2Vzc0F1dGg8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgLi4uZmllbGROYW1lczogKGtleW9mIEZJRUxEVFlQRSlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBncmFudCB0byBDb2duaXRvIGlkZW50aXR5IHBvb2wgYXMgbm9uZSBpcyBwcm92aWRlZCcpO1xuICAgIH1cbiAgICB0aGlzLmdyYW50QWNjZXNzKHRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sLmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBnZXRGdW5jdGlvbkZvck9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uc1tgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMYW1iZGFSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogTGFtYmRhUmVzb2x2ZXJPcHRpb25zLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgY29uc3QgaXNCYXRjaCA9IG9wdGlvbnM/Lm1heEJhdGNoU2l6ZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3QgZW50cnlGaWxlID0gYC4vc3JjL2xhbWJkYS8ke29wZXJhdGlvbklkfS50c2A7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5RmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvbGFtYmRhLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYEZuJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMucHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgYWRkaXRpb25hbEVudjogdGhpcy5wcm9wcy5hZGRpdGlvbmFsRW52LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi50aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmIHtcbiAgICAgICAgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbikudXNlcnBvb2wsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSAmJiB7XG4gICAgICAgIHRhYmxlOiB0aGlzLnByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlLnRhYmxlLFxuICAgICAgICB0YWJsZVdyaXRlczogdHlwZU5hbWUgPT09ICdNdXRhdGlvbicsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5hc3NldENkbiAmJiB7XG4gICAgICAgIGFzc2V0RG9tYWluTmFtZTogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldERvbWFpbk5hbWUsXG4gICAgICAgIGFzc2V0QnVja2V0OiB0aGlzLnByb3BzLmFzc2V0Q2RuLmFzc2V0QnVja2V0LFxuICAgICAgfSxcbiAgICAgIGxhbWJkYU9wdGlvbnM6IHRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICB9KTtcbiAgICB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWRdID0gZm47XG4gICAgVGFncy5vZihmbikuYWRkKCdHcmFwaFFMJywgZGVzY3JpcHRpb24pO1xuXG4gICAgLy8gaWYgKHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUR1cmF0aW9uc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0R1cmF0aW9uKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUludm9rZXNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNJbnZvY2F0aW9ucygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNFcnJvcnMoKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljVGhyb3R0bGVzKCkpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuTGFtYmRhRGF0YVNvdXJjZShzY29wZSwgYExhbWJkYURTJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgbmFtZTogYExhbWJkYV8ke3R5cGVOYW1lIGFzIHN0cmluZ31fJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWAsXG4gICAgICBsYW1iZGFGdW5jdGlvbjogZm4sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNCYXRjaCkge1xuICAgICAgLy8gQSBiYXRjaCBmaWVsZCBhbHdheXMgdGFrZXMgdGhlIFVOSVQgQmF0Y2hJbnZva2UgcGF0aCwgZXZlbiB3aGVuIHRoZSBBUElcbiAgICAgIC8vIGhhcyB0eXBlZEVycm9ycyBlbmFibGVkLiBtYXhCYXRjaFNpemUgd2lucyBvdmVyIHR5cGVkRXJyb3JzIGZvciB0aGlzXG4gICAgICAvLyBmaWVsZCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlcyBoYXZlIG5vIGVxdWl2YWxlbnQgb25cbiAgICAgIC8vIHRoZSBBUFBTWU5DX0pTIHBpcGVsaW5lIHJlc29sdmVyLiBBcHBTeW5jIGJhdGNoZXMgdXAgdG8gbWF4QmF0Y2hTaXplXG4gICAgICAvLyBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIGEgc2luZ2xlIExhbWJkYSBjYWxsIGhhbmRsZWQgYnlcbiAgICAgIC8vIGNyZWF0ZUFwcFN5bmNCYXRjaEhhbmRsZXIuIFRoZSBMMiBCYXNlUmVzb2x2ZXJQcm9wcy5tYXhCYXRjaFNpemUgc2V0c1xuICAgICAgLy8gTWF4QmF0Y2hTaXplIGRpcmVjdGx5LCBzbyBubyBlc2NhcGUgaGF0Y2ggaXMgbmVlZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIEFQUFNZTkNfVFlQRURfRVJST1JTIGlzIGludGVudGlvbmFsbHkgbm90IHNldCBoZXJlLiBBIGJhdGNoIGhhbmRsZXIgdGhhdFxuICAgICAgLy8gdGhyb3dzIGEgdHlwZWQgZXJyb3IgcmV0aHJvd3MgYW5kIGZhaWxzIHRoZSBpbnZvY2F0aW9uIGxvdWRseSBpbnN0ZWFkIG9mXG4gICAgICAvLyBoYXZpbmcgdGhlIGVycm9yIGVudmVsb3BlIHJldHVybmVkIGFzIGZpZWxkIGRhdGEuXG4gICAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGRhdGFTb3VyY2UsXG4gICAgICAgIG1heEJhdGNoU2l6ZTogb3B0aW9ucyEubWF4QmF0Y2hTaXplLFxuICAgICAgICByZXF1ZXN0TWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVxdWVzdCgnJHV0aWxzLnRvSnNvbigkY29udGV4dCknLCAnQmF0Y2hJbnZva2UnKSxcbiAgICAgICAgcmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXN1bHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcm9wcy50eXBlZEVycm9ycykge1xuICAgICAgLy8gRGVmYXVsdCAocHJlLSMzODUpIHNoYXBlOiBhIHBsYWluIFVOSVQgcmVzb2x2ZXIgd2l0aCB0aGUgTGFtYmRhIGRhdGFcbiAgICAgIC8vIHNvdXJjZSBzZXQgZGlyZWN0bHkuIE5vIHJlc3BvbnNlIGhhbmRsZXIsIHNvIHRoZSBlcnJvciBlbnZlbG9wZSBmcm9tXG4gICAgICAvLyBjcmVhdGVBcHBTeW5jSGFuZGxlciB3b3VsZCBiZSBzdXJmYWNlZCBhcyBmaWVsZCBkYXRhIHJhdGhlciB0aGFuIGFcbiAgICAgIC8vIEdyYXBoUUwgZXJyb3IuIE9wdCBpbiB2aWEgYHR5cGVkRXJyb3JzOiB0cnVlYCB0byBnZXQgdGhlIHBpcGVsaW5lIGJlbG93LlxuICAgICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBkYXRhU291cmNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm47XG4gICAgfVxuXG4gICAgLy8gQ291cGxlIHRoZSBoYW5kbGVyIHRvIHRoaXMgcGlwZWxpbmUuIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMgdGhlXG4gICAgLy8gZXJyb3IgZW52ZWxvcGUgb25seSB3aGVuIEFQUFNZTkNfVFlQRURfRVJST1JTID09PSAndHJ1ZSc7IG90aGVyd2lzZSBpdFxuICAgIC8vIHJldGhyb3dzIHRoZSB0eXBlZCBlcnJvci4gSW5qZWN0IHRoZSBmbGFnIGhlcmUgKGFuZCBvbmx5IGhlcmUpIHNvIHRoZVxuICAgIC8vIGVudmVsb3BlIGJlaGF2aW9yIGlzIGFjdGl2ZSBleGFjdGx5IG9uIHRoZSBwYXRoIHRoYXQgaGFzIHRoZSByZXNwb25zZVxuICAgIC8vIGhhbmRsZXIgdG8gaW50ZXJwcmV0IGl0LiBUaGUgZGVmYXVsdCBVTklUIHBhdGggYWJvdmUgbGVhdmVzIHRoZSBlbnYgdmFyXG4gICAgLy8gdW5zZXQsIHNvIGEgaGFuZGxlciB0aGF0IHRocm93cyBhbiBBcHBTeW5jRXJyb3IgdGhlcmUgZmFpbHMgbG91ZGx5LlxuICAgIGZuLmFkZEVudmlyb25tZW50KCdBUFBTWU5DX1RZUEVEX0VSUk9SUycsICd0cnVlJyk7XG5cbiAgICAvLyBUaGUgTGFtYmRhIGludm9rZSBydW5zIGFzIGEgcGlwZWxpbmUgZnVuY3Rpb24gKGEgc2luZ2xlIEludm9rZSBwYXNzdGhyb3VnaCksXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlcidzIHJlc3BvbnNlIGhhbmRsZXIgaW50ZXJwcmV0cyB0aGUgZXJyb3IgZW52ZWxvcGUgdGhhdFxuICAgIC8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMuIEEgZGlyZWN0LUxhbWJkYSByZXNvbHZlciB3aXRob3V0IGEgcmVzcG9uc2VcbiAgICAvLyBoYW5kbGVyIHdvdWxkIHN1cmZhY2UgdGhlIHsgZGF0YSwgZXJyb3JUeXBlLCBlcnJvck1lc3NhZ2UsIGVycm9ySW5mbyB9XG4gICAgLy8gZW52ZWxvcGUgYXMgcGxhaW4gZmllbGQgZGF0YSwgc28gdGhlIHR5cGVkIGVycm9ycy5hcHBzeW5jLiogZXJyb3JzIG9ubHlcbiAgICAvLyBiZWNvbWUgR3JhcGhRTCBlcnJvcnMgYmVjYXVzZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlciBhdHRhY2hlZCBiZWxvdy5cbiAgICBjb25zdCBpbnZva2VGdW5jdGlvbiA9IG5ldyBhd3NfYXBwc3luYy5BcHBzeW5jRnVuY3Rpb24oc2NvcGUsIGBMYW1iZGFGbiR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIG5hbWU6IGBMYW1iZGFfJHsodHlwZU5hbWUgYXMgc3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfV8keyhmaWVsZE5hbWUgYXMgU3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfWAsXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tSW5saW5lKGBpbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJztcblxuLy8gSW52b2tlIHRoZSBMYW1iZGEgZGF0YSBzb3VyY2Ugd2l0aCB0aGUgZnVsbCByZXNvbHZlciBjb250ZXh0IGFzIHRoZSBwYXlsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4KSB7XG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uOiAnSW52b2tlJyxcbiAgICBwYXlsb2FkOiBjdHgsXG4gIH07XG59XG5cbi8vIFBhc3MgdGhlIExhbWJkYSByZXN1bHQgdGhyb3VnaCB1bmNoYW5nZWQ7IHRoZSByZXNvbHZlciByZXNwb25zZSBoYW5kbGVyXG4vLyBjb252ZXJ0cyB0aGUgZXJyb3IgZW52ZWxvcGUgaW50byBhIEdyYXBoUUwgZXJyb3IuXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2UoY3R4KSB7XG4gIHJldHVybiBjdHgucmVzdWx0O1xufVxuYCksXG4gICAgfSk7XG5cbiAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIHR5cGVOYW1lOiB0eXBlTmFtZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICBydW50aW1lOiBhd3NfYXBwc3luYy5GdW5jdGlvblJ1bnRpbWUuSlNfMV8wXzAsXG4gICAgICBwaXBlbGluZUNvbmZpZzogW2ludm9rZUZ1bmN0aW9uXSxcbiAgICAgIGNvZGU6IGF3c19hcHBzeW5jLkNvZGUuZnJvbUlubGluZShgaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0KGN0eCkge1xuICByZXR1cm4ge307XG59XG5cbi8vIENvbnZlcnQgdGhlIGVycm9yIGVudmVsb3BlIHJldHVybmVkIGJ5IGNyZWF0ZUFwcFN5bmNIYW5kbGVyIGludG8gYSBHcmFwaFFMIGVycm9yLlxuLy8gdXRpbC5lcnJvciAvIHV0aWwuYXBwZW5kRXJyb3IgdGFrZSAobWVzc2FnZSwgZXJyb3JUeXBlLCBkYXRhLCBlcnJvckluZm8pLCBzb1xuLy8gZXJyb3JUeXBlIGFuZCBlcnJvckluZm8gcmVhY2ggdGhlIGNsaWVudC4gV2l0aG91dCB0aGlzLCBBcHBTeW5jIHdvdWxkIHN1cmZhY2Vcbi8vIHRoZSBlbnZlbG9wZSBvYmplY3QgYXMgdGhlIGZpZWxkIHJlc3VsdCBpbnN0ZWFkIG9mIGFzIGEgR3JhcGhRTCBlcnJvci5cbi8vXG4vLyBUaGUgZW52ZWxvcGUgaXMgcmVjb2duaXNlZCBieSBpdHMgcmVzZXJ2ZWQgX19hcHBTeW5jRXJyb3Igc2VudGluZWwga2V5LCB3aGljaFxuLy8gY3JlYXRlQXBwU3luY0hhbmRsZXIgc3RhbXBzLiBCcmFuY2hpbmcgb24gdGhlIHNlbnRpbmVsIChub3Qgb24gYSBiYXJlXG4vLyBlcnJvck1lc3NhZ2UpIG1lYW5zIGEgbGVnaXRpbWF0ZSByZXN1bHQgdGhhdCBtZXJlbHkgaGFzIGFuIGVycm9yTWVzc2FnZSBmaWVsZFxuLy8gaXMgcmV0dXJuZWQgdW5jaGFuZ2VkIGluc3RlYWQgb2YgYmVpbmcgbWlzcmVhZCBhcyBhIHR5cGVkIGVycm9yLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlKGN0eCkge1xuICBpZiAoY3R4LmVycm9yKSB7XG4gICAgdXRpbC5hcHBlbmRFcnJvcihjdHguZXJyb3IubWVzc2FnZSwgY3R4LmVycm9yLnR5cGUsIGN0eC5yZXN1bHQpO1xuICAgIHJldHVybiBjdHgucmVzdWx0O1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGN0eC5wcmV2LnJlc3VsdDtcbiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuX19hcHBTeW5jRXJyb3IpIHtcbiAgICB1dGlsLmVycm9yKHJlc3VsdC5lcnJvck1lc3NhZ2UsIHJlc3VsdC5lcnJvclR5cGUsIG51bGwsIHJlc3VsdC5lcnJvckluZm8pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5gKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBwdWJsaWMgYWRkRHluYW1vRGJWdGxSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogT21pdDxWdGxSZXNvbHZlck9wdGlvbnMsICdkYXRhU291cmNlJz4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R5bmFtb0RCIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICB0aGlzLmFkZFZ0bFJlc29sdmVyKHR5cGVOYW1lLCBmaWVsZE5hbWUsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMudGFibGVEYXRhU291cmNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREeW5hbW9EYkpTUmVzb2x2ZXI8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgZmllbGROYW1lOiBrZXlvZiBGSUVMRFRZUEUsXG4gICAgb3B0aW9ucz86IEpzUmVzb2x2ZXJPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlRGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEeW5hbW9EQiBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgdGhpcy5hZGRKU1Jlc29sdmVyKHR5cGVOYW1lLCBmaWVsZE5hbWUsIHRoaXMudGFibGVEYXRhU291cmNlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc3Rhc2hWYWx1ZXM6IHtcbiAgICAgICAgLi4ub3B0aW9ucz8uc3Rhc2hWYWx1ZXMgPz8ge30sXG4gICAgICAgIHRhYmxlOiB0aGlzLnByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlIS50YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZEpTUmVzb2x2ZXI8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgZmllbGROYW1lOiBrZXlvZiBGSUVMRFRZUEUsXG4gICAgZGF0YVNvdXJjZTogYXdzX2FwcHN5bmMuQmFzZURhdGFTb3VyY2UsIG9wdGlvbnM/OiBKc1Jlc29sdmVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYCR7dHlwZU5hbWUgYXMgc3RyaW5nfS4ke2ZpZWxkTmFtZSBhcyBTdHJpbmd9YDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGBUeXBlICR7dHlwZU5hbWUgYXMgc3RyaW5nfSBGaWVsZCAke2ZpZWxkTmFtZSBhcyBTdHJpbmd9IFJlc29sdmVyYDtcblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBjb25zdCByZXNvbHZlckRpciA9ICcuL3NyYy9qcy1yZXNvbHZlci8nO1xuICAgIGNvbnN0IGZ1bmN0aW9uczogSnNSZXNvbHZlckNvbmZpZ1tdID0gW107XG5cbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucGlwZWxpbmVTdGVwTmFtZXMgfHwgb3B0aW9ucy5waXBlbGluZVN0ZXBOYW1lcy5sZW5ndGggPT0gMCkge1xuICAgICAgZnVuY3Rpb25zLnB1c2goe1xuICAgICAgICBuYW1lOiAnZGVmYXVsdCcsXG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICBzdGVwQ291bnQ6IDEsXG4gICAgICAgIGVudHJ5RmlsZTogYCR7cmVzb2x2ZXJEaXJ9LyR7b3BlcmF0aW9uSWR9LnRzYCxcbiAgICAgICAgZnVuY3Rpb25JZDogYEpTRnVuY3Rpb24ke29wZXJhdGlvbklkfWAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVuY3Rpb25zLnB1c2goLi4ub3B0aW9ucy5waXBlbGluZVN0ZXBOYW1lcy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgc3RlcENvdW50OiBvcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzIS5sZW5ndGgsXG4gICAgICAgIGVudHJ5RmlsZTogYCR7cmVzb2x2ZXJEaXJ9LyR7b3BlcmF0aW9uSWR9LiR7bmFtZX0udHNgLFxuICAgICAgICBmdW5jdGlvbklkOiBgSlNGdW5jdGlvbiR7b3BlcmF0aW9uSWR9JHtuYW1lfWAsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBpcGVsaW5lQ29uZmlnID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZuLmVudHJ5RmlsZSkpIHtcbiAgICAgICAgZnMubWtkaXJTeW5jKHJlc29sdmVyRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5jcmVhdGVKU1Jlc29sdmVyRmlsZShmbiwgdHlwZU5hbWUgYXMgc3RyaW5nLCBmaWVsZE5hbWUgYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QganNGdW5jdGlvbiA9IG5ldyBhd3NfYXBwc3luYy5BcHBzeW5jRnVuY3Rpb24oc2NvcGUsIGZuLmZ1bmN0aW9uSWQsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgbmFtZTogb3BlcmF0aW9uSWQucmVwbGFjZSgvXFwuL2csICcnKSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIGRhdGFTb3VyY2UsXG4gICAgICAgIGNvZGU6IGF3c19hcHBzeW5jLkNvZGUuZnJvbUFzc2V0KCcuJywge1xuICAgICAgICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgICAgICAgIGRlcGxveVRpbWU6IHRydWUsXG4gICAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICAgIGltYWdlOiBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoJ2R1bW15JyksIC8vIFdpbGwgbmV2ZXIgYmUgdXNlZCBkdWUgdG8gbG9jYWwgYnVuZGxpbmdcbiAgICAgICAgICAgIG91dHB1dFR5cGU6IEJ1bmRsaW5nT3V0cHV0LlNJTkdMRV9GSUxFLFxuICAgICAgICAgICAgZnVuY3Rpb25JZDogZm4uZnVuY3Rpb25JZCxcbiAgICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvc1BsYXRmb3JtID0gb3MucGxhdGZvcm0oKTtcbiAgICAgICAgICAgICAgICBleGVjKFxuICAgICAgICAgICAgICAgICAgb3NQbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICdjbWQnIDogJ2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBvc1BsYXRmb3JtID09PSAnd2luMzInID8gJy9jJyA6ICctYycsXG4gICAgICAgICAgICAgICAgICAgIGBlc2J1aWxkIC0tYnVuZGxlIC0tc291cmNlbWFwPWlubGluZSAtLXNvdXJjZXMtY29udGVudD1mYWxzZSAtLXRhcmdldD1lc25leHQgLS1wbGF0Zm9ybT1ub2RlIC0tZm9ybWF0PWVzbSAtLWV4dGVybmFsOkBhd3MtYXBwc3luYy91dGlscyAtLW91dGRpcj0ke291dHB1dERpcn0gJHtmbi5lbnRyeUZpbGV9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiB9LFxuICAgICAgICAgICAgICAgICAgICBzdGRpbzogWyAvLyBzaG93IG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmUnLCAvLyBpZ25vcmUgc3RkaW9cbiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZGVyciwgLy8gcmVkaXJlY3Qgc3Rkb3V0IHRvIHN0ZGVyclxuICAgICAgICAgICAgICAgICAgICAgICdpbmhlcml0JywgLy8gaW5oZXJpdCBzdGRlcnJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBvc1BsYXRmb3JtID09PSAnd2luMzInLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBCdW5kbGluZ09wdGlvbnMsXG4gICAgICAgIH0pLFxuICAgICAgICBydW50aW1lOiBhd3NfYXBwc3luYy5GdW5jdGlvblJ1bnRpbWUuSlNfMV8wXzAsXG4gICAgICB9KTtcbiAgICAgIHBpcGVsaW5lQ29uZmlnLnB1c2goanNGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgcGlwZWxpbmVDb25maWcsXG4gICAgICBjb2RlOiBhd3NfYXBwc3luYy5Db2RlLmZyb21JbmxpbmUoYFxuICAgIC8vIFRoZSBiZWZvcmUgc3RlcFxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0KGN0eCkge1xuICAgICAgY29uc29sZS5sb2coY3R4KTtcbiR7T2JqZWN0LmVudHJpZXMob3B0aW9ucz8uc3Rhc2hWYWx1ZXMgPz8gW10pLm1hcCh2YWwgPT4gYCAgICAgIGN0eC5zdGFzaC4ke3ZhbFswXX0gPSAnJHt2YWxbMV19J2ApLmpvaW4oJ1xcbicpfVxuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgLy8gVGhlIGFmdGVyIHN0ZXBcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzcG9uc2UoY3R4KSB7XG4gICAgICByZXR1cm4gY3R4LnByZXYucmVzdWx0XG4gICAgfVxuICBgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRWdGxSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zOiBWdGxSZXNvbHZlck9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcGVyYXRpb25JZCA9IGAke3R5cGVOYW1lIGFzIHN0cmluZ30uJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWA7XG5cbiAgICBjb25zdCBtYXBwaW5nUmVxRmlsZSA9IGAuL3NyYy92dGwvJHtvcGVyYXRpb25JZH0ucmVxLnZ0bGA7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG1hcHBpbmdSZXFGaWxlKSkge1xuICAgICAgZnMubWtkaXJTeW5jKCcuL3NyYy92dGwvJywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG1hcHBpbmdSZXFGaWxlLCAnIyMgUmVxdWVzdCBtYXBwaW5nJywgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZ1Jlc0ZpbGUgPSBgLi9zcmMvdnRsLyR7b3BlcmF0aW9uSWR9LnJlcy52dGxgO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhtYXBwaW5nUmVzRmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvdnRsLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhtYXBwaW5nUmVzRmlsZSwgJyR1dGlsLnRvSnNvbigkY3R4LnJlc3VsdCknLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIHR5cGVOYW1lOiB0eXBlTmFtZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICBkYXRhU291cmNlOiBvcHRpb25zLmRhdGFTb3VyY2UsXG4gICAgICByZXF1ZXN0TWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUuZnJvbVN0cmluZyh0aGlzLnN1YnN0VmFyaWFibGVzKGZzLnJlYWRGaWxlU3luYyhtYXBwaW5nUmVxRmlsZSkudG9TdHJpbmcoJ3V0Zi04JyksIG9wdGlvbnMudmFyaWFibGVzKSksXG4gICAgICByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZTogYXdzX2FwcHN5bmMuTWFwcGluZ1RlbXBsYXRlLmZyb21TdHJpbmcodGhpcy5zdWJzdFZhcmlhYmxlcyhmcy5yZWFkRmlsZVN5bmMobWFwcGluZ1Jlc0ZpbGUpLnRvU3RyaW5nKCd1dGYtOCcpLCBvcHRpb25zLnZhcmlhYmxlcykpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHNjb3BlIGZvciBjcmVhdGluZyByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiB0eXBlIG5hbWUuXG4gICAqIElmIHVzZU5lc3RlZFN0YWNrcyBpcyBlbmFibGVkLCByZXR1cm5zIGEgbmVzdGVkIHN0YWNrIGZvciB0aGUgdHlwZSBuYW1lLFxuICAgKiBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBPdGhlcndpc2UsIHJldHVybnMgdGhpcyBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIFF1ZXJ5LCBNdXRhdGlvbiwgYW5kIFN1YnNjcmlwdGlvbiBlYWNoIGdldCB0aGVpciBvd24gbmVzdGVkIHN0YWNrLlxuICAgKiBBbGwgb3RoZXIgdHlwZXMgKGZpZWxkIHJlc29sdmVycykgc2hhcmUgYSBzaW5nbGUgXCJGaWVsZFwiIG5lc3RlZCBzdGFjay5cbiAgICpcbiAgICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIEdyYXBoUUwgdHlwZSBuYW1lIChlLmcuLCAnUXVlcnknLCAnTXV0YXRpb24nLCAnU3Vic2NyaXB0aW9uJywgb3IgYSBjdXN0b20gdHlwZSlcbiAgICogQHJldHVybnMgVGhlIGNvbnN0cnVjdCB0byB1c2UgYXMgc2NvcGUgZm9yIGNyZWF0aW5nIHJlc291cmNlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lOiBzdHJpbmcpOiBDb25zdHJ1Y3Qge1xuICAgIGlmICghdGhpcy5wcm9wcy51c2VOZXN0ZWRTdGFja3MpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RUeXBlcyA9IFsnUXVlcnknLCAnTXV0YXRpb24nLCAnU3Vic2NyaXB0aW9uJ107XG4gICAgY29uc3Qgc3RhY2tLZXkgPSByb290VHlwZXMuaW5jbHVkZXModHlwZU5hbWUpID8gdHlwZU5hbWUgOiAnRmllbGQnO1xuXG4gICAgaWYgKCF0aGlzLm5lc3RlZFN0YWNrc1tzdGFja0tleV0pIHtcbiAgICAgIHRoaXMubmVzdGVkU3RhY2tzW3N0YWNrS2V5XSA9IG5ldyBOZXN0ZWRTdGFjayh0aGlzLCBgJHtzdGFja0tleX1SZXNvbHZlcnNgLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTmVzdGVkIHN0YWNrIGZvciAke3N0YWNrS2V5fSByZXNvbHZlcnNgLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RhY2tzW3N0YWNrS2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic3RWYXJpYWJsZXMoZGF0YTogc3RyaW5nLCB2YXJzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9KTogc3RyaW5nIHtcbiAgICBsZXQgcmVzID0gZGF0YTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdmFycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YXJzLCBuYW1lKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcnNbbmFtZV07XG4gICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwkXFx7JHtuYW1lfVxcfWAsICdnJyksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRW50cnlGaWxlKGVudHJ5RmlsZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGFyZ1R5cGUgPSBgJHt0eXBlTmFtZX0ke3VwcGVyY2FzZUZpcnN0KGZpZWxkTmFtZSl9QXJnc2A7XG4gICAgZnMud3JpdGVGaWxlU3luYyhlbnRyeUZpbGUsIGBpbXBvcnQgeyBhcGkgfSBmcm9tICdjZGstc2VydmVybGVzcy9saWIvbGFtYmRhJztcbmltcG9ydCB7ICR7dHlwZU5hbWV9LCAke2FyZ1R5cGV9IH0gZnJvbSAnLi4vZ2VuZXJhdGVkL2dyYXBocWwuJHt0aGlzLnByb3BzLmFwaU5hbWUudG9Mb3dlckNhc2UoKX0tbW9kZWwuZ2VuZXJhdGVkJztcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhcGkuY3JlYXRlQXBwU3luY0hhbmRsZXI8JHthcmdUeXBlfSwgJHt0eXBlTmFtZX1bJyR7ZmllbGROYW1lfSddPihhc3luYyAoY3R4KSA9PiB7XG4gIGN0eC5sb2dnZXIuaW5mbyhKU09OLnN0cmluZ2lmeShjdHguZXZlbnQpKTtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgeWV0IGltcGxlbWVudGVkJyk7XG59KTtgLCB7XG4gICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSlNSZXNvbHZlckZpbGUoZm46IEpzUmVzb2x2ZXJDb25maWcsIHR5cGVOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXJnVHlwZSA9IGAke3R5cGVOYW1lfSR7dXBwZXJjYXNlRmlyc3QoZmllbGROYW1lKX1BcmdzYDtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gKGZuLmluZGV4ID09IChmbi5zdGVwQ291bnQgLSAxKSkgPyBgJHt0eXBlTmFtZX1bJyR7ZmllbGROYW1lfSddYCA6ICdhbnknO1xuXG4gICAgZnMud3JpdGVGaWxlU3luYyhmbi5lbnRyeUZpbGUsIGBpbXBvcnQgeyBDb250ZXh0LCB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJztcbmltcG9ydCB7ICR7dHlwZU5hbWV9LCAke2FyZ1R5cGV9IH0gZnJvbSAnLi4vZ2VuZXJhdGVkL2dyYXBocWwuJHt0aGlzLnByb3BzLmFwaU5hbWUudG9Mb3dlckNhc2UoKX0tbW9kZWwuZ2VuZXJhdGVkJztcblxuLyoqXG4gKiBSZXF1ZXN0IGZvciAke3R5cGVOYW1lfS4ke2ZpZWxkTmFtZX0gKFN0ZXA6ICR7Zm4ubmFtZX0gJHtmbi5pbmRleCArIDF9LyR7Zm4uc3RlcENvdW50fSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4OiBDb250ZXh0PCR7YXJnVHlwZX0+KTogYW55IHtcbiAgY29uc29sZS5sb2coY3R4KTtcbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGZvciAke3R5cGVOYW1lfS4ke2ZpZWxkTmFtZX0gKFN0ZXA6ICR7Zm4ubmFtZX0gJHtmbi5pbmRleCArIDF9LyR7Zm4uc3RlcENvdW50fSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlKGN0eDogQ29udGV4dDwke2FyZ1R5cGV9Pik6ICR7cmV0dXJuVHlwZX0ge1xuICBjb25zb2xlLmxvZyhjdHgpO1xuICByZXR1cm4gY3R4LnJlc3VsdC5pdGVtcztcbn1gLCB7XG4gICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICB9KTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHVwcGVyY2FzZUZpcnN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSk7XG59XG5cbi8qKlxuICogQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvbWFpbi9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcy9saWIvdXRpbC50c1xuICogYXMgaXQgaXMgbm90IGV4cG9ydGVkIGJ5IGF3cy1jZGstbGliXG4gKi9cbmZ1bmN0aW9uIGV4ZWMoY21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogU3Bhd25TeW5jT3B0aW9ucykge1xuICBjb25zdCBwcm9jID0gc3Bhd25TeW5jKGNtZCwgYXJncywgb3B0aW9ucyk7XG5cbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICB0aHJvdyBwcm9jLmVycm9yO1xuICB9XG5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgaWYgKHByb2Muc3Rkb3V0IHx8IHByb2Muc3RkZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtTdGF0dXMgJHtwcm9jLnN0YXR1c31dIHN0ZG91dDogJHtwcm9jLnN0ZG91dD8udG9TdHJpbmcoKS50cmltKCl9XFxuXFxuXFxuc3RkZXJyOiAke3Byb2Muc3RkZXJyPy50b1N0cmluZygpLnRyaW0oKX1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2NtZH0gJHthcmdzLmpvaW4oJyAnKX0gJHtvcHRpb25zPy5jd2QgPyBgcnVuIGluIGRpcmVjdG9yeSAke29wdGlvbnMuY3dkfWAgOiAnJ30gZXhpdGVkIHdpdGggc3RhdHVzICR7cHJvYy5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcHJvYztcbn1cblxuIl19
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2dyYXBocWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLGlEQUE0RDtBQUM1RCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLDZDQUE2TDtBQUc3TCx5Q0FBbUQ7QUFDbkQsaUNBQXdDO0FBQ3hDLCtDQUF5RTtBQTZHekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsVUFBc0IsU0FBUSxrQkFBTztJQTRCaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBbUIsS0FBc0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFEaUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUF2QmpGOztXQUVHO1FBQ0ssZUFBVSxHQUE4QyxFQUFFLENBQUM7UUFFbkU7OztXQUdHO1FBQ2MsaUJBQVksR0FBd0MsRUFBRSxDQUFDO1FBaUJ0RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUF1QyxDQUFDO1FBRWpFLElBQUksZ0JBQXVELENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsZ0JBQWdCLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDeEIsV0FBVyxFQUFFLElBQUksb0NBQXNCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDNUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFXO29CQUM1QixNQUFNLEVBQUUsV0FBVztvQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUN4QixVQUFVLEVBQUUsb0NBQXNCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxV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aXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IFNwYXduU3luY09wdGlvbnMsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IEFzc2V0SGFzaFR5cGUsIEJ1bmRsaW5nT3B0aW9ucywgQnVuZGxpbmdPdXRwdXQsIENmbk91dHB1dCwgRG9ja2VySW1hZ2UsIE5lc3RlZFN0YWNrLCBUYWdzLCBhd3NfYXBwc3luYywgYXdzX2NlcnRpZmljYXRlbWFuYWdlciwgYXdzX2lhbSwgYXdzX2xvZ3MsIGF3c19yb3V0ZTUzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb2duaXRvQXV0aGVudGljYXRpb24gfSBmcm9tICcuL2F1dGhlbnRpY2F0aW9uJztcbmltcG9ydCB7IEJhc2VBcGksIEJhc2VBcGlQcm9wcyB9IGZyb20gJy4vYmFzZS1hcGknO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tICcuL2Z1bmMnO1xuaW1wb3J0IHsgQ0ZOX09VVFBVVF9TVUZGSVhfR1JBUEhRTF9ET01BSU5OQU1FIH0gZnJvbSAnLi4vc2hhcmVkL291dHB1dHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoUWxBcGlQcm9wcyBleHRlbmRzIEJhc2VBcGlQcm9wcyB7XG4gIGRlZmluaXRpb25GaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCByZXNvbHZlcnMgYW5kIExhbWJkYSBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGluIG5lc3RlZCBzdGFja3NcbiAgICogZ3JvdXBlZCBieSB0eXBlIChRdWVyeSwgTXV0YXRpb24sIFN1YnNjcmlwdGlvbiwgRmllbGQpLlxuICAgKlxuICAgKiBXQVJOSU5HOiBPbmx5IGVuYWJsZSB0aGlzIGlmIHlvdSBhcmUgYXBwcm9hY2hpbmcgb3IgaGl0dGluZyBDbG91ZEZvcm1hdGlvbidzXG4gICAqIDUwMCByZXNvdXJjZSBsaW1pdC4gTmVzdGVkIHN0YWNrcyBoYXZlIHNpZ25pZmljYW50IGRvd25zaWRlczpcbiAgICogLSBTbG93ZXIgZGVwbG95bWVudHMgZHVlIHRvIGFkZGl0aW9uYWwgc3RhY2sgb3BlcmF0aW9uc1xuICAgKiAtIE1vcmUgY29tcGxleCBkZWJ1Z2dpbmcgYW5kIGVycm9yIHRyYWNpbmdcbiAgICogLSBIYXJkZXIgdG8gbmF2aWdhdGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIGNvbnNvbGVcbiAgICogLSBDcm9zcy1zdGFjayByZWZlcmVuY2VzIGFkZCBjb21wbGV4aXR5XG4gICAqXG4gICAqIFdBUk5JTkc6IENoYW5naW5nIHRoaXMgc2V0dGluZyBvbiBhbiBleGlzdGluZyBzdGFjayByZXF1aXJlcyBtYW51YWwgaW50ZXJ2ZW50aW9uLlxuICAgKiBDbG91ZEZvcm1hdGlvbiBjYW5ub3QgYXV0b21hdGljYWxseSBtb3ZlIHJlc291cmNlcyBiZXR3ZWVuIHN0YWNrcy4gWW91IG1heSBuZWVkXG4gICAqIHRvIGRlbGV0ZSBhbmQgcmVjcmVhdGUgcmVzb2x2ZXJzLCBvciBwZXJmb3JtIGEgdHdvLXN0ZXAgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHVzZU5lc3RlZFN0YWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGFkZExhbWJkYVJlc29sdmVyIHN5bnRoZXNpemVzIGFuIEFQUFNZTkNfSlMgcGlwZWxpbmUgcmVzb2x2ZXIgd2hvc2VcbiAgICogcmVzcG9uc2UgaGFuZGxlciBjb252ZXJ0cyB0aGUgZXJyb3JzLmFwcHN5bmMuKiBlbnZlbG9wZSByZXR1cm5lZCBieVxuICAgKiBjcmVhdGVBcHBTeW5jSGFuZGxlciBpbnRvIGEgdHlwZWQgR3JhcGhRTCBlcnJvci5cbiAgICpcbiAgICogVW50eXBlZCBlcnJvcnMgc3RpbGwgZmFpbCB0aGUgaW52b2NhdGlvbiwgYW5kIHRoZSBwaXBlbGluZSBmdW5jdGlvbiByYWlzZXNcbiAgICogdGhlbSBhcyBHcmFwaFFMIGVycm9ycyB3aXRoIEFwcFN5bmMncyBpbnZva2UgZXJyb3IgdHlwZSAoZS5nLlxuICAgKiBgTGFtYmRhOlVuaGFuZGxlZGApLCBhcyBhIFVOSVQgZGlyZWN0LUxhbWJkYSByZXNvbHZlciBkb2VzLlxuICAgKlxuICAgKiBXaGVuIGZhbHNlICh0aGUgZGVmYXVsdCksIGFkZExhbWJkYVJlc29sdmVyIHN5bnRoZXNpemVzIGEgcGxhaW4gVU5JVFxuICAgKiBkaXJlY3QtTGFtYmRhIHJlc29sdmVyICh0aGUgcHJlLSMzODUgYmVoYXZpb3IpIHdpdGggbm8gcmVzcG9uc2UgaGFuZGxlci5cbiAgICogVGhlIExhbWJkYSBnZXRzIG5vIEFQUFNZTkNfVFlQRURfRVJST1JTIGZsYWcsIHNvIGNyZWF0ZUFwcFN5bmNIYW5kbGVyXG4gICAqIHJldGhyb3dzIGFuIEFwcFN5bmNFcnJvciBhbmQgQXBwU3luYyByZXBvcnRzIGl0IGFzIGBMYW1iZGE6VW5oYW5kbGVkYFxuICAgKiB3aXRob3V0IHRoZSB0eXBlZCBlcnJvclR5cGUgYW5kIGVycm9ySW5mby5cbiAgICpcbiAgICogVGhpcyBmbGFnIGFwcGxpZXMgdG8gQUxMIExhbWJkYSByZXNvbHZlcnMgb24gdGhlIEFQSS4gRW5hYmxpbmcgaXQgY2hhbmdlc1xuICAgKiB0aGUgcmVzb2x2ZXIgdG9wb2xvZ3kgZnJvbSBVTklUIHRvIFBJUEVMSU5FLCB3aGljaCBwcm9kdWNlcyBhIGNkayBkaWZmIGZvclxuICAgKiBldmVyeSBMYW1iZGEgcmVzb2x2ZXIsIHNvIG9wdCBpbiBkZWxpYmVyYXRlbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlZEVycm9ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCwgYWRkTGFtYmRhUmVzb2x2ZXIgd2lyZXMgYW4gQXBwU3luYyBCYXRjaEludm9rZSByZXNvbHZlciBpbnN0ZWFkIG9mIGFcbiAgICogc2luZ2xlIGludm9rZS4gVGhlIGdlbmVyYXRlZCBVTklUIHJlc29sdmVyIGdldHMgTWF4QmF0Y2hTaXplIHNldCB0byB0aGlzXG4gICAqIHZhbHVlLCBhIEJhdGNoSW52b2tlIHJlcXVlc3QgdGVtcGxhdGVcbiAgICogKE1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXF1ZXN0KCckdXRpbHMudG9Kc29uKCRjb250ZXh0KScsICdCYXRjaEludm9rZScpKSBhbmRcbiAgICogYSBNYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVzdWx0KCkgcmVzcG9uc2UgdGVtcGxhdGUsIHNvIEFwcFN5bmMgZ3JvdXBzIHVwIHRvXG4gICAqIHRoaXMgbWFueSBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIG9uZSBMYW1iZGEgY2FsbC4gUGFpciB0aGlzIHdpdGhcbiAgICogY3JlYXRlQXBwU3luY0JhdGNoSGFuZGxlciwgd2hvc2UgaGFuZGxlciByZWNlaXZlcyB0aGUgYmF0Y2hlZCBldmVudHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBtYXhCYXRjaFNpemUgYW5kIGB0eXBlZEVycm9yc2AgYXJlIHNldCwgbWF4QmF0Y2hTaXplIHdpbnMgZm9yIHRoaXNcbiAgICogZmllbGQuIFRoZSBmaWVsZCBnZXRzIHRoZSBVTklUIEJhdGNoSW52b2tlIHJlc29sdmVyIHJhdGhlciB0aGFuIHRoZVxuICAgKiB0eXBlZEVycm9ycyBBUFBTWU5DX0pTIHBpcGVsaW5lLCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlc1xuICAgKiBoYXZlIG5vIGVxdWl2YWxlbnQgb24gdGhhdCBwaXBlbGluZS4gVHlwZWQgZXJyb3JzIHRocm93biBieSBhIGJhdGNoIGhhbmRsZXJcbiAgICogYXJlIG5vdCBjb252ZXJ0ZWQgdG8gR3JhcGhRTCBlcnJvcnMuIFRoZXkgcmV0aHJvdyBhbmQgZmFpbCB0aGUgaW52b2NhdGlvbixcbiAgICogc28gYSBiYXRjaCBoYW5kbGVyIHNob3VsZCBub3QgcmVseSBvbiB0aGUgdHlwZWQtZXJyb3ItdG8tR3JhcGhRTC1lcnJvclxuICAgKiBjb252ZXJzaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAoc2luZ2xlIGludm9rZSwgdGhlIHByZS1iYXRjaCBiZWhhdmlvdXI7IG5vIE1heEJhdGNoU2l6ZSBhbmQgbm8gbWFwcGluZyB0ZW1wbGF0ZXMpXG4gICAqL1xuICByZWFkb25seSBtYXhCYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnRsUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhc291cmNlIHRoZSBWVEwgcmVzb2x2ZXIgdGFyZ2V0c1xuICAgKi9cbiAgZGF0YVNvdXJjZTogYXdzX2FwcHN5bmMuQmFzZURhdGFTb3VyY2U7XG5cbiAgLyoqXG4gICAqIHN0cmluZyByZXBsYWNlbWVudHMgdG8gcHJvY2VzcyBvbiB0aGUgVlRMXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIHZhcmlhYmxlIGV4cGFuc2lvbnNcbiAgICovXG4gIHZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgcHV0IGludG8gdGhlIFwic3Rhc2hcIiBvZiB0aGUgcmVzb2x2ZXIgcGlwZWxpbmVcbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc3Rhc2hWYWx1ZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBuYW1lIG9mIHRoZSBwaXBlbGluZSBzdGVwcyB0byBjcmVhdGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBvbmx5IGEgZGVmYXVsdCBzdGVwIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVTdGVwTmFtZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpzUmVzb2x2ZXJDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHN0ZXBDb3VudDogbnVtYmVyO1xuICBlbnRyeUZpbGU6IHN0cmluZztcbiAgZnVuY3Rpb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdCBzZXRzIHVwIGFuIEFXUyBBcHBTeW5jIEdyYXBoUUwgQVBJIGludGVncmF0ZWQgd2l0aCBDb2duaXRvIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgRHluYW1vREIgZm9yIGRhdGEgc3RvcmFnZS5cbiAqIFRoaXMgY29uc3RydWN0IGZhY2lsaXRhdGVzIHRoZSBjcmVhdGlvbiBvZiBhIEdyYXBoUUwgQVBJIHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9ucywgaW5jbHVkaW5nIGN1c3RvbSBkb21haW4sIGxvZ2dpbmcsIHNjaGVtYSBkZWZpbml0aW9uLFxuICogYW5kIGF1dGhvcml6YXRpb24gdXNpbmcgQ29nbml0byBVc2VyIFBvb2wgYW5kIElkZW50aXR5IFBvb2wuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyB0byBkeW5hbWljYWxseSBhZGQgcmVzb2x2ZXJzIGFuZCBncmFudCBhY2Nlc3MgdG8gc3BlY2lmaWMgZmllbGRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBSRVNPTFZFUlMgLSBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgR3JhcGhRTCByZXNvbHZlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwaSA9IG5ldyBHcmFwaFFsQXBpKHRoaXMsICdNeUdyYXBoUWxBcGknLCB7XG4gKiAgIGFwaU5hbWU6ICdNeUFQSScsXG4gKiAgIHN0YWdlTmFtZTogJ2RldicsXG4gKiAgIGRlZmluaXRpb25GaWxlTmFtZTogJ3NjaGVtYS5ncmFwaHFsJyxcbiAqICAgYXV0aGVudGljYXRpb246IG15Q29nbml0b0F1dGgsXG4gKiAgIHNpbmdsZVRhYmxlRGF0YXN0b3JlOiBteUR5bmFtb0RCVGFibGUsXG4gKiB9KTtcbiAqXG4gKiAvLyBBZGQgYSBMYW1iZGEgcmVzb2x2ZXJcbiAqIGFwaS5hZGRMYW1iZGFSZXNvbHZlcignUXVlcnknLCAnZ2V0SXRlbScpO1xuICpcbiAqIC8vIEdyYW50IGFjY2VzcyB0byB1bmF1dGhlbnRpY2F0ZWQgdXNlcnMgZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAqIGFwaS5ncmFudEFjY2Vzc1VuQXV0aCgnUXVlcnknLCAnZ2V0SXRlbScpO1xuICovXG5leHBvcnQgY2xhc3MgR3JhcGhRbEFwaTxSRVNPTFZFUlM+IGV4dGVuZHMgQmFzZUFwaSB7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgQXBwU3luYyBHcmFwaFFMIEFQSSBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IGF3c19hcHBzeW5jLkdyYXBocWxBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBEeW5hbW9EQiBkYXRhIHNvdXJjZSBmb3IgdGhlIEdyYXBoUUwgQVBJLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlRGF0YVNvdXJjZT86IGF3c19hcHBzeW5jLkR5bmFtb0RiRGF0YVNvdXJjZTtcblxuICAvKipcbiAgICogQSBjb2xsZWN0aW9uIG9mIExhbWJkYSBmdW5jdGlvbnMgdXNlZCBhcyByZXNvbHZlcnMgZm9yIHRoZSBHcmFwaFFMIEFQSS5cbiAgICovXG4gIHByaXZhdGUgX2Z1bmN0aW9uczogeyBbb3BlcmF0aW9uSWQ6IHN0cmluZ106IExhbWJkYUZ1bmN0aW9uIH0gPSB7fTtcblxuICAvKipcbiAgICogTmVzdGVkIHN0YWNrcyBmb3IgcmVzb2x2ZXJzLCBncm91cGVkIGJ5IHR5cGUgbmFtZS5cbiAgICogT25seSB1c2VkIHdoZW4gdXNlTmVzdGVkU3RhY2tzIGlzIHRydWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrczogeyBbdHlwZU5hbWU6IHN0cmluZ106IE5lc3RlZFN0YWNrIH0gPSB7fTtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29nbml0b0F1dGg6IENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBHcmFwaFFsQXBpLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdGhpcyBjb25zdHJ1Y3QgaXMgZGVmaW5lZC5cbiAgICogQHBhcmFtIGlkIC0gVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEdyYXBoUWxBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jb2duaXRvQXV0aCA9IHByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAgIGxldCBjdXN0b21Eb21haW5OYW1lOiBhd3NfYXBwc3luYy5Eb21haW5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmFwaUZRRE4pIHtcbiAgICAgIGN1c3RvbURvbWFpbk5hbWUgPSB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgY2VydGlmaWNhdGU6IG5ldyBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlKHRoaXMsICdDZXJ0Jywge1xuICAgICAgICAgIGhvc3RlZFpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICBkb21haW5OYW1lOiB0aGlzLmFwaUZRRE4sXG4gICAgICAgICAgdmFsaWRhdGlvbjogYXdzX2NlcnRpZmljYXRlbWFuYWdlci5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsICdHcmFwaFFsQXBpRG9tYWluTmFtZScsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmFwaU5hbWV9JHtDRk5fT1VUUFVUX1NVRkZJWF9HUkFQSFFMX0RPTUFJTk5BTUV9YCxcbiAgICAgICAgdmFsdWU6IHRoaXMuYXBpRlFETixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYXBpID0gbmV3IGF3c19hcHBzeW5jLkdyYXBocWxBcGkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogYCR7cHJvcHMuYXBpTmFtZX0gWyR7cHJvcHMuc3RhZ2VOYW1lfV1gLFxuICAgICAgbG9nQ29uZmlnOiB7XG4gICAgICAgIGZpZWxkTG9nTGV2ZWw6IGF3c19hcHBzeW5jLkZpZWxkTG9nTGV2ZWwuQUxMLFxuICAgICAgICByZXRlbnRpb246IGF3c19sb2dzLlJldGVudGlvbkRheXMuVFdPX01PTlRIUyxcbiAgICAgIH0sXG4gICAgICBzY2hlbWE6IGF3c19hcHBzeW5jLlNjaGVtYUZpbGUuZnJvbUFzc2V0KHByb3BzLmRlZmluaXRpb25GaWxlTmFtZSksXG4gICAgICBkb21haW5OYW1lOiBjdXN0b21Eb21haW5OYW1lLFxuICAgICAgLi4udGhpcy5jb2duaXRvQXV0aCAmJiB7XG4gICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHtcbiAgICAgICAgICBhZGRpdGlvbmFsQXV0aG9yaXphdGlvbk1vZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb25UeXBlOiBhd3NfYXBwc3luYy5BdXRob3JpemF0aW9uVHlwZS5VU0VSX1BPT0wsXG4gICAgICAgICAgICAgIHVzZXJQb29sQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgdXNlclBvb2w6IHRoaXMuY29nbml0b0F1dGgudXNlcnBvb2wsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbjogYXdzX2FwcHN5bmMuVXNlclBvb2xEZWZhdWx0QWN0aW9uLkRFTlksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5jb2duaXRvQXV0aC5pZGVudGl0eVBvb2wgPyBbeyBhdXRob3JpemF0aW9uVHlwZTogYXdzX2FwcHN5bmMuQXV0aG9yaXphdGlvblR5cGUuSUFNIH1dIDogW10sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGN1c3RvbURvbWFpbk5hbWUgJiYgdGhpcy5hcGkuYXBwU3luY0RvbWFpbk5hbWUpIHtcbiAgICAgIG5ldyBhd3Nfcm91dGU1My5DbmFtZVJlY29yZCh0aGlzLCAnRG5zUmVjb3JkJywge1xuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUhLFxuICAgICAgICByZWNvcmROYW1lOiBjdXN0b21Eb21haW5OYW1lLmRvbWFpbk5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpLmFwcFN5bmNEb21haW5OYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKChwcm9wcy5tb25pdG9yaW5nID8/IHRydWUpICYmIHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgLy8gICAgIG5hbWVzcGFjZTogJ0FXUy9BcHBTeW5jJyxcbiAgICAvLyAgICAgbWV0cmljTmFtZTogJzVYWEVycm9yJyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnNFhYRXJyb3InLFxuICAgIC8vICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgLy8gICAgICAgR3JhcGhRTEFQSUlkOiB0aGlzLmFwaS5hcGlJZCxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdBdmVyYWdlJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTAnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTUnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTknLFxuICAgIC8vICAgfSkpO1xuICAgIC8vIH1cblxuICAgIGlmIChwcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuRHluYW1vRGJEYXRhU291cmNlKHRoaXMsICdTaW5nbGVUYWJsZVNvdXJjZScsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdGFibGU6IHByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlPy50YWJsZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIGdyYW50ZWU6IGF3c19pYW0uSUdyYW50YWJsZSxcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICAuLi5maWVsZE5hbWVzOiAoa2V5b2YgRklFTERUWVBFKVtdKTogdm9pZCB7XG4gICAgdGhpcy5hcGkuZ3JhbnQoZ3JhbnRlZSwgYXdzX2FwcHN5bmMuSWFtUmVzb3VyY2Uub2ZUeXBlKHR5cGVOYW1lIGFzIHN0cmluZywgLi4uZmllbGROYW1lcyBhcyBzdHJpbmdbXSksICdhcHBzeW5jOkdyYXBoUUwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzVW5BdXRoPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIC4uLmZpZWxkTmFtZXM6IChrZXlvZiBGSUVMRFRZUEUpW11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ3JhbnQgdG8gQ29nbml0byBpZGVudGl0eSBwb29sIGFzIG5vbmUgaXMgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgdGhpcy5ncmFudEFjY2Vzcyh0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbC51bmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHB1YmxpYyBncmFudEFjY2Vzc0F1dGg8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgLi4uZmllbGROYW1lczogKGtleW9mIEZJRUxEVFlQRSlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBncmFudCB0byBDb2duaXRvIGlkZW50aXR5IHBvb2wgYXMgbm9uZSBpcyBwcm92aWRlZCcpO1xuICAgIH1cbiAgICB0aGlzLmdyYW50QWNjZXNzKHRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sLmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBnZXRGdW5jdGlvbkZvck9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uc1tgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMYW1iZGFSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogTGFtYmRhUmVzb2x2ZXJPcHRpb25zLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgY29uc3QgaXNCYXRjaCA9IG9wdGlvbnM/Lm1heEJhdGNoU2l6ZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3QgZW50cnlGaWxlID0gYC4vc3JjL2xhbWJkYS8ke29wZXJhdGlvbklkfS50c2A7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5RmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvbGFtYmRhLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYEZuJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMucHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgYWRkaXRpb25hbEVudjogdGhpcy5wcm9wcy5hZGRpdGlvbmFsRW52LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi50aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmIHtcbiAgICAgICAgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbikudXNlcnBvb2wsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSAmJiB7XG4gICAgICAgIHRhYmxlOiB0aGlzLnByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlLnRhYmxlLFxuICAgICAgICB0YWJsZVdyaXRlczogdHlwZU5hbWUgPT09ICdNdXRhdGlvbicsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5hc3NldENkbiAmJiB7XG4gICAgICAgIGFzc2V0RG9tYWluTmFtZTogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldERvbWFpbk5hbWUsXG4gICAgICAgIGFzc2V0QnVja2V0OiB0aGlzLnByb3BzLmFzc2V0Q2RuLmFzc2V0QnVja2V0LFxuICAgICAgfSxcbiAgICAgIGxhbWJkYU9wdGlvbnM6IHRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICB9KTtcbiAgICB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWRdID0gZm47XG4gICAgVGFncy5vZihmbikuYWRkKCdHcmFwaFFMJywgZGVzY3JpcHRpb24pO1xuXG4gICAgLy8gaWYgKHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUR1cmF0aW9uc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0R1cmF0aW9uKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUludm9rZXNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNJbnZvY2F0aW9ucygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNFcnJvcnMoKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljVGhyb3R0bGVzKCkpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuTGFtYmRhRGF0YVNvdXJjZShzY29wZSwgYExhbWJkYURTJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgbmFtZTogYExhbWJkYV8ke3R5cGVOYW1lIGFzIHN0cmluZ31fJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWAsXG4gICAgICBsYW1iZGFGdW5jdGlvbjogZm4sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNCYXRjaCkge1xuICAgICAgLy8gQSBiYXRjaCBmaWVsZCBhbHdheXMgdGFrZXMgdGhlIFVOSVQgQmF0Y2hJbnZva2UgcGF0aCwgZXZlbiB3aGVuIHRoZSBBUElcbiAgICAgIC8vIGhhcyB0eXBlZEVycm9ycyBlbmFibGVkLiBtYXhCYXRjaFNpemUgd2lucyBvdmVyIHR5cGVkRXJyb3JzIGZvciB0aGlzXG4gICAgICAvLyBmaWVsZCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlcyBoYXZlIG5vIGVxdWl2YWxlbnQgb25cbiAgICAgIC8vIHRoZSBBUFBTWU5DX0pTIHBpcGVsaW5lIHJlc29sdmVyLiBBcHBTeW5jIGJhdGNoZXMgdXAgdG8gbWF4QmF0Y2hTaXplXG4gICAgICAvLyBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIGEgc2luZ2xlIExhbWJkYSBjYWxsIGhhbmRsZWQgYnlcbiAgICAgIC8vIGNyZWF0ZUFwcFN5bmNCYXRjaEhhbmRsZXIuIFRoZSBMMiBCYXNlUmVzb2x2ZXJQcm9wcy5tYXhCYXRjaFNpemUgc2V0c1xuICAgICAgLy8gTWF4QmF0Y2hTaXplIGRpcmVjdGx5LCBzbyBubyBlc2NhcGUgaGF0Y2ggaXMgbmVlZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIEFQUFNZTkNfVFlQRURfRVJST1JTIGlzIGludGVudGlvbmFsbHkgbm90IHNldCBoZXJlLiBBIGJhdGNoIGhhbmRsZXIgdGhhdFxuICAgICAgLy8gdGhyb3dzIGEgdHlwZWQgZXJyb3IgcmV0aHJvd3MgYW5kIGZhaWxzIHRoZSBpbnZvY2F0aW9uIGxvdWRseSBpbnN0ZWFkIG9mXG4gICAgICAvLyBoYXZpbmcgdGhlIGVycm9yIGVudmVsb3BlIHJldHVybmVkIGFzIGZpZWxkIGRhdGEuXG4gICAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGRhdGFTb3VyY2UsXG4gICAgICAgIG1heEJhdGNoU2l6ZTogb3B0aW9ucyEubWF4QmF0Y2hTaXplLFxuICAgICAgICByZXF1ZXN0TWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVxdWVzdCgnJHV0aWxzLnRvSnNvbigkY29udGV4dCknLCAnQmF0Y2hJbnZva2UnKSxcbiAgICAgICAgcmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXN1bHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcm9wcy50eXBlZEVycm9ycykge1xuICAgICAgLy8gRGVmYXVsdCAocHJlLSMzODUpIHNoYXBlOiBhIHBsYWluIFVOSVQgcmVzb2x2ZXIgd2l0aCB0aGUgTGFtYmRhIGRhdGFcbiAgICAgIC8vIHNvdXJjZSBzZXQgZGlyZWN0bHkuIE5vIHJlc3BvbnNlIGhhbmRsZXIsIHNvIHRoZSBlcnJvciBlbnZlbG9wZSBmcm9tXG4gICAgICAvLyBjcmVhdGVBcHBTeW5jSGFuZGxlciB3b3VsZCBiZSBzdXJmYWNlZCBhcyBmaWVsZCBkYXRhIHJhdGhlciB0aGFuIGFcbiAgICAgIC8vIEdyYXBoUUwgZXJyb3IuIE9wdCBpbiB2aWEgYHR5cGVkRXJyb3JzOiB0cnVlYCB0byBnZXQgdGhlIHBpcGVsaW5lIGJlbG93LlxuICAgICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBkYXRhU291cmNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm47XG4gICAgfVxuXG4gICAgLy8gQ291cGxlIHRoZSBoYW5kbGVyIHRvIHRoaXMgcGlwZWxpbmUuIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMgdGhlXG4gICAgLy8gZXJyb3IgZW52ZWxvcGUgb25seSB3aGVuIEFQUFNZTkNfVFlQRURfRVJST1JTID09PSAndHJ1ZSc7IG90aGVyd2lzZSBpdFxuICAgIC8vIHJldGhyb3dzIHRoZSB0eXBlZCBlcnJvci4gSW5qZWN0IHRoZSBmbGFnIGhlcmUgKGFuZCBvbmx5IGhlcmUpIHNvIHRoZVxuICAgIC8vIGVudmVsb3BlIGJlaGF2aW9yIGlzIGFjdGl2ZSBleGFjdGx5IG9uIHRoZSBwYXRoIHRoYXQgaGFzIHRoZSByZXNwb25zZVxuICAgIC8vIGhhbmRsZXIgdG8gaW50ZXJwcmV0IGl0LiBUaGUgZGVmYXVsdCBVTklUIHBhdGggYWJvdmUgbGVhdmVzIHRoZSBlbnYgdmFyXG4gICAgLy8gdW5zZXQsIHNvIGEgaGFuZGxlciB0aGF0IHRocm93cyBhbiBBcHBTeW5jRXJyb3IgdGhlcmUgZmFpbHMgbG91ZGx5LlxuICAgIGZuLmFkZEVudmlyb25tZW50KCdBUFBTWU5DX1RZUEVEX0VSUk9SUycsICd0cnVlJyk7XG5cbiAgICAvLyBUaGUgTGFtYmRhIGludm9rZSBydW5zIGFzIGEgcGlwZWxpbmUgZnVuY3Rpb24gKGEgc2luZ2xlIEludm9rZSBwYXNzdGhyb3VnaCksXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlcidzIHJlc3BvbnNlIGhhbmRsZXIgaW50ZXJwcmV0cyB0aGUgZXJyb3IgZW52ZWxvcGUgdGhhdFxuICAgIC8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMuIEEgZGlyZWN0LUxhbWJkYSByZXNvbHZlciB3aXRob3V0IGEgcmVzcG9uc2VcbiAgICAvLyBoYW5kbGVyIHdvdWxkIHN1cmZhY2UgdGhlIHsgZGF0YSwgZXJyb3JUeXBlLCBlcnJvck1lc3NhZ2UsIGVycm9ySW5mbyB9XG4gICAgLy8gZW52ZWxvcGUgYXMgcGxhaW4gZmllbGQgZGF0YSwgc28gdGhlIHR5cGVkIGVycm9ycy5hcHBzeW5jLiogZXJyb3JzIG9ubHlcbiAgICAvLyBiZWNvbWUgR3JhcGhRTCBlcnJvcnMgYmVjYXVzZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlciBhdHRhY2hlZCBiZWxvdy5cbiAgICBjb25zdCBpbnZva2VGdW5jdGlvbiA9IG5ldyBhd3NfYXBwc3luYy5BcHBzeW5jRnVuY3Rpb24oc2NvcGUsIGBMYW1iZGFGbiR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIG5hbWU6IGBMYW1iZGFfJHsodHlwZU5hbWUgYXMgc3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfV8keyhmaWVsZE5hbWUgYXMgU3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfWAsXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tSW5saW5lKGBpbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJztcblxuLy8gSW52b2tlIHRoZSBMYW1iZGEgZGF0YSBzb3VyY2Ugd2l0aCB0aGUgZnVsbCByZXNvbHZlciBjb250ZXh0IGFzIHRoZSBwYXlsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4KSB7XG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uOiAnSW52b2tlJyxcbiAgICBwYXlsb2FkOiBjdHgsXG4gIH07XG59XG5cbi8vIEEgZmFpbGVkIGludm9rZSAoYW4gdW50eXBlZCBlcnJvciByZXRocm93biBieSBjcmVhdGVBcHBTeW5jSGFuZGxlciwgYSB0aW1lb3V0LFxuLy8gYSBtaXNzaW5nIHBlcm1pc3Npb24pIGxhbmRzIGluIHRoaXMgZnVuY3Rpb24ncyBjdHguZXJyb3IuIEFwcFN5bmMgZHJvcHMgaXRcbi8vIHVubGVzcyB0aGlzIGhhbmRsZXIgcmFpc2VzIGl0LCBhbmQgdGhlIGZpZWxkIHdvdWxkIHJlc29sdmUgdG8gbnVsbCB3aXRoIG5vXG4vLyBHcmFwaFFMIGVycm9yLiBSYWlzZSBpdCB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UgYW5kIHR5cGUgYSBVTklUIGRpcmVjdC1MYW1iZGFcbi8vIHJlc29sdmVyIHJlcG9ydHMuIE90aGVyd2lzZSBwYXNzIHRoZSByZXN1bHQgdGhyb3VnaDsgdGhlIHJlc29sdmVyIHJlc3BvbnNlXG4vLyBoYW5kbGVyIGNvbnZlcnRzIHRoZSB0eXBlZCBlcnJvciBlbnZlbG9wZSBpbnRvIGEgR3JhcGhRTCBlcnJvci5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgaWYgKGN0eC5lcnJvcikge1xuICAgIHV0aWwuZXJyb3IoY3R4LmVycm9yLm1lc3NhZ2UsIGN0eC5lcnJvci50eXBlKTtcbiAgfVxuICByZXR1cm4gY3R4LnJlc3VsdDtcbn1cbmApLFxuICAgIH0pO1xuXG4gICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgcGlwZWxpbmVDb25maWc6IFtpbnZva2VGdW5jdGlvbl0sXG4gICAgICBjb2RlOiBhd3NfYXBwc3luYy5Db2RlLmZyb21JbmxpbmUoYGltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHgpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG4vLyBDb252ZXJ0IHRoZSBlcnJvciBlbnZlbG9wZSByZXR1cm5lZCBieSBjcmVhdGVBcHBTeW5jSGFuZGxlciBpbnRvIGEgR3JhcGhRTCBlcnJvci5cbi8vIHV0aWwuZXJyb3IgLyB1dGlsLmFwcGVuZEVycm9yIHRha2UgKG1lc3NhZ2UsIGVycm9yVHlwZSwgZGF0YSwgZXJyb3JJbmZvKSwgc29cbi8vIGVycm9yVHlwZSBhbmQgZXJyb3JJbmZvIHJlYWNoIHRoZSBjbGllbnQuIFdpdGhvdXQgdGhpcywgQXBwU3luYyB3b3VsZCBzdXJmYWNlXG4vLyB0aGUgZW52ZWxvcGUgb2JqZWN0IGFzIHRoZSBmaWVsZCByZXN1bHQgaW5zdGVhZCBvZiBhcyBhIEdyYXBoUUwgZXJyb3IuXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIHJlY29nbmlzZWQgYnkgaXRzIHJlc2VydmVkIF9fYXBwU3luY0Vycm9yIHNlbnRpbmVsIGtleSwgd2hpY2hcbi8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHN0YW1wcy4gQnJhbmNoaW5nIG9uIHRoZSBzZW50aW5lbCAobm90IG9uIGEgYmFyZVxuLy8gZXJyb3JNZXNzYWdlKSBtZWFucyBhIGxlZ2l0aW1hdGUgcmVzdWx0IHRoYXQgbWVyZWx5IGhhcyBhbiBlcnJvck1lc3NhZ2UgZmllbGRcbi8vIGlzIHJldHVybmVkIHVuY2hhbmdlZCBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlYWQgYXMgYSB0eXBlZCBlcnJvci5cbi8vXG4vLyBJbnZva2UtbGV2ZWwgZXJyb3JzIGFyZSByYWlzZWQgYnkgdGhlIHBpcGVsaW5lIGZ1bmN0aW9uIGl0c2VsZjogYW4gZXJyb3IgbGVmdFxuLy8gaW4gYSBmdW5jdGlvbidzIGN0eC5lcnJvciBuZXZlciByZWFjaGVzIHRoaXMgaGFuZGxlcidzIGN0eC5lcnJvci5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgY29uc3QgcmVzdWx0ID0gY3R4LnByZXYucmVzdWx0O1xuICBpZiAocmVzdWx0ICYmIHJlc3VsdC5fX2FwcFN5bmNFcnJvcikge1xuICAgIHV0aWwuZXJyb3IocmVzdWx0LmVycm9yTWVzc2FnZSwgcmVzdWx0LmVycm9yVHlwZSwgbnVsbCwgcmVzdWx0LmVycm9ySW5mbyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmApLFxuICAgIH0pO1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGREeW5hbW9EYlZ0bFJlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIG9wdGlvbnM/OiBPbWl0PFZ0bFJlc29sdmVyT3B0aW9ucywgJ2RhdGFTb3VyY2UnPik6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZURhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHluYW1vREIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHRoaXMuYWRkVnRsUmVzb2x2ZXIodHlwZU5hbWUsIGZpZWxkTmFtZSwge1xuICAgICAgZGF0YVNvdXJjZTogdGhpcy50YWJsZURhdGFTb3VyY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZER5bmFtb0RiSlNSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogSnNSZXNvbHZlck9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R5bmFtb0RCIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICB0aGlzLmFkZEpTUmVzb2x2ZXIodHlwZU5hbWUsIGZpZWxkTmFtZSwgdGhpcy50YWJsZURhdGFTb3VyY2UsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzdGFzaFZhbHVlczoge1xuICAgICAgICAuLi5vcHRpb25zPy5zdGFzaFZhbHVlcyA/PyB7fSxcbiAgICAgICAgdGFibGU6IHRoaXMucHJvcHMuc2luZ2xlVGFibGVEYXRhc3RvcmUhLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkSlNSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBkYXRhU291cmNlOiBhd3NfYXBwc3luYy5CYXNlRGF0YVNvdXJjZSwgb3B0aW9ucz86IEpzUmVzb2x2ZXJPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWUgYXMgc3RyaW5nKTtcblxuICAgIGNvbnN0IHJlc29sdmVyRGlyID0gJy4vc3JjL2pzLXJlc29sdmVyLyc7XG4gICAgY29uc3QgZnVuY3Rpb25zOiBKc1Jlc29sdmVyQ29uZmlnW10gPSBbXTtcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5waXBlbGluZVN0ZXBOYW1lcyB8fCBvcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdkZWZhdWx0JyxcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIHN0ZXBDb3VudDogMSxcbiAgICAgICAgZW50cnlGaWxlOiBgJHtyZXNvbHZlckRpcn0vJHtvcGVyYXRpb25JZH0udHNgLFxuICAgICAgICBmdW5jdGlvbklkOiBgSlNGdW5jdGlvbiR7b3BlcmF0aW9uSWR9YCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmdW5jdGlvbnMucHVzaCguLi5vcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzLm1hcCgobmFtZSwgaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBzdGVwQ291bnQ6IG9wdGlvbnMucGlwZWxpbmVTdGVwTmFtZXMhLmxlbmd0aCxcbiAgICAgICAgZW50cnlGaWxlOiBgJHtyZXNvbHZlckRpcn0vJHtvcGVyYXRpb25JZH0uJHtuYW1lfS50c2AsXG4gICAgICAgIGZ1bmN0aW9uSWQ6IGBKU0Z1bmN0aW9uJHtvcGVyYXRpb25JZH0ke25hbWV9YCxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGlwZWxpbmVDb25maWcgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZm4gb2YgZnVuY3Rpb25zKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZm4uZW50cnlGaWxlKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMocmVzb2x2ZXJEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmNyZWF0ZUpTUmVzb2x2ZXJGaWxlKGZuLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBqc0Z1bmN0aW9uID0gbmV3IGF3c19hcHBzeW5jLkFwcHN5bmNGdW5jdGlvbihzY29wZSwgZm4uZnVuY3Rpb25JZCwge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICBuYW1lOiBvcGVyYXRpb25JZC5yZXBsYWNlKC9cXC4vZywgJycpLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgZGF0YVNvdXJjZSxcbiAgICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tQXNzZXQoJy4nLCB7XG4gICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgZGVwbG95VGltZTogdHJ1ZSxcbiAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgaW1hZ2U6IERvY2tlckltYWdlLmZyb21SZWdpc3RyeSgnZHVtbXknKSwgLy8gV2lsbCBuZXZlciBiZSB1c2VkIGR1ZSB0byBsb2NhbCBidW5kbGluZ1xuICAgICAgICAgICAgb3V0cHV0VHlwZTogQnVuZGxpbmdPdXRwdXQuU0lOR0xFX0ZJTEUsXG4gICAgICAgICAgICBmdW5jdGlvbklkOiBmbi5mdW5jdGlvbklkLFxuICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuICAgICAgICAgICAgICAgIGV4ZWMoXG4gICAgICAgICAgICAgICAgICBvc1BsYXRmb3JtID09PSAnd2luMzInID8gJ2NtZCcgOiAnYmFzaCcsXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIG9zUGxhdGZvcm0gPT09ICd3aW4zMicgPyAnL2MnIDogJy1jJyxcbiAgICAgICAgICAgICAgICAgICAgYGVzYnVpbGQgLS1idW5kbGUgLS1zb3VyY2VtYXA9aW5saW5lIC0tc291cmNlcy1jb250ZW50PWZhbHNlIC0tdGFyZ2V0PWVzbmV4dCAtLXBsYXRmb3JtPW5vZGUgLS1mb3JtYXQ9ZXNtIC0tZXh0ZXJuYWw6QGF3cy1hcHBzeW5jL3V0aWxzIC0tb3V0ZGlyPSR7b3V0cHV0RGlyfSAke2ZuLmVudHJ5RmlsZX1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbIC8vIHNob3cgb3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgJ2lnbm9yZScsIC8vIGlnbm9yZSBzdGRpb1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLCAvLyByZWRpcmVjdCBzdGRvdXQgdG8gc3RkZXJyXG4gICAgICAgICAgICAgICAgICAgICAgJ2luaGVyaXQnLCAvLyBpbmhlcml0IHN0ZGVyclxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IG9zUGxhdGZvcm0gPT09ICd3aW4zMicsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIEJ1bmRsaW5nT3B0aW9ucyxcbiAgICAgICAgfSksXG4gICAgICAgIHJ1bnRpbWU6IGF3c19hcHBzeW5jLkZ1bmN0aW9uUnVudGltZS5KU18xXzBfMCxcbiAgICAgIH0pO1xuICAgICAgcGlwZWxpbmVDb25maWcucHVzaChqc0Z1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIHR5cGVOYW1lOiB0eXBlTmFtZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICBydW50aW1lOiBhd3NfYXBwc3luYy5GdW5jdGlvblJ1bnRpbWUuSlNfMV8wXzAsXG4gICAgICBwaXBlbGluZUNvbmZpZyxcbiAgICAgIGNvZGU6IGF3c19hcHBzeW5jLkNvZGUuZnJvbUlubGluZShgXG4gICAgLy8gVGhlIGJlZm9yZSBzdGVwXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4KSB7XG4gICAgICBjb25zb2xlLmxvZyhjdHgpO1xuJHtPYmplY3QuZW50cmllcyhvcHRpb25zPy5zdGFzaFZhbHVlcyA/PyBbXSkubWFwKHZhbCA9PiBgICAgICAgY3R4LnN0YXNoLiR7dmFsWzBdfSA9ICcke3ZhbFsxXX0nYCkuam9pbignXFxuJyl9XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICAvLyBUaGUgYWZ0ZXIgc3RlcFxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgICAgIHJldHVybiBjdHgucHJldi5yZXN1bHRcbiAgICB9XG4gIGApLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFZ0bFJlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIG9wdGlvbnM6IFZ0bFJlc29sdmVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYCR7dHlwZU5hbWUgYXMgc3RyaW5nfS4ke2ZpZWxkTmFtZSBhcyBTdHJpbmd9YDtcblxuICAgIGNvbnN0IG1hcHBpbmdSZXFGaWxlID0gYC4vc3JjL3Z0bC8ke29wZXJhdGlvbklkfS5yZXEudnRsYDtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWFwcGluZ1JlcUZpbGUpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoJy4vc3JjL3Z0bC8nLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMobWFwcGluZ1JlcUZpbGUsICcjIyBSZXF1ZXN0IG1hcHBpbmcnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nUmVzRmlsZSA9IGAuL3NyYy92dGwvJHtvcGVyYXRpb25JZH0ucmVzLnZ0bGA7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG1hcHBpbmdSZXNGaWxlKSkge1xuICAgICAgZnMubWtkaXJTeW5jKCcuL3NyYy92dGwvJywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG1hcHBpbmdSZXNGaWxlLCAnJHV0aWwudG9Kc29uKCRjdHgucmVzdWx0KScsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWUgYXMgc3RyaW5nKTtcblxuICAgIG5ldyBhd3NfYXBwc3luYy5SZXNvbHZlcihzY29wZSwgYFJlc29sdmVyJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lIGFzIHN0cmluZyxcbiAgICAgIGRhdGFTb3VyY2U6IG9wdGlvbnMuZGF0YVNvdXJjZSxcbiAgICAgIHJlcXVlc3RNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5mcm9tU3RyaW5nKHRoaXMuc3Vic3RWYXJpYWJsZXMoZnMucmVhZEZpbGVTeW5jKG1hcHBpbmdSZXFGaWxlKS50b1N0cmluZygndXRmLTgnKSwgb3B0aW9ucy52YXJpYWJsZXMpKSxcbiAgICAgIHJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUuZnJvbVN0cmluZyh0aGlzLnN1YnN0VmFyaWFibGVzKGZzLnJlYWRGaWxlU3luYyhtYXBwaW5nUmVzRmlsZSkudG9TdHJpbmcoJ3V0Zi04JyksIG9wdGlvbnMudmFyaWFibGVzKSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc2NvcGUgZm9yIGNyZWF0aW5nIHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIHR5cGUgbmFtZS5cbiAgICogSWYgdXNlTmVzdGVkU3RhY2tzIGlzIGVuYWJsZWQsIHJldHVybnMgYSBuZXN0ZWQgc3RhY2sgZm9yIHRoZSB0eXBlIG5hbWUsXG4gICAqIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuIE90aGVyd2lzZSwgcmV0dXJucyB0aGlzIGNvbnN0cnVjdC5cbiAgICpcbiAgICogUXVlcnksIE11dGF0aW9uLCBhbmQgU3Vic2NyaXB0aW9uIGVhY2ggZ2V0IHRoZWlyIG93biBuZXN0ZWQgc3RhY2suXG4gICAqIEFsbCBvdGhlciB0eXBlcyAoZmllbGQgcmVzb2x2ZXJzKSBzaGFyZSBhIHNpbmdsZSBcIkZpZWxkXCIgbmVzdGVkIHN0YWNrLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgR3JhcGhRTCB0eXBlIG5hbWUgKGUuZy4sICdRdWVyeScsICdNdXRhdGlvbicsICdTdWJzY3JpcHRpb24nLCBvciBhIGN1c3RvbSB0eXBlKVxuICAgKiBAcmV0dXJucyBUaGUgY29uc3RydWN0IHRvIHVzZSBhcyBzY29wZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2VzXG4gICAqL1xuICBwcml2YXRlIGdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IENvbnN0cnVjdCB7XG4gICAgaWYgKCF0aGlzLnByb3BzLnVzZU5lc3RlZFN0YWNrcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdFR5cGVzID0gWydRdWVyeScsICdNdXRhdGlvbicsICdTdWJzY3JpcHRpb24nXTtcbiAgICBjb25zdCBzdGFja0tleSA9IHJvb3RUeXBlcy5pbmNsdWRlcyh0eXBlTmFtZSkgPyB0eXBlTmFtZSA6ICdGaWVsZCc7XG5cbiAgICBpZiAoIXRoaXMubmVzdGVkU3RhY2tzW3N0YWNrS2V5XSkge1xuICAgICAgdGhpcy5uZXN0ZWRTdGFja3Nbc3RhY2tLZXldID0gbmV3IE5lc3RlZFN0YWNrKHRoaXMsIGAke3N0YWNrS2V5fVJlc29sdmVyc2AsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBOZXN0ZWQgc3RhY2sgZm9yICR7c3RhY2tLZXl9IHJlc29sdmVyc2AsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRTdGFja3Nbc3RhY2tLZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzdFZhcmlhYmxlcyhkYXRhOiBzdHJpbmcsIHZhcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge30pOiBzdHJpbmcge1xuICAgIGxldCByZXMgPSBkYXRhO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YXJzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhcnMsIG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFyc1tuYW1lXTtcbiAgICAgICAgcmVzID0gcmVzLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCRcXHske25hbWV9XFx9YCwgJ2cnKSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXJnVHlwZSA9IGAke3R5cGVOYW1lfSR7dXBwZXJjYXNlRmlyc3QoZmllbGROYW1lKX1BcmdzYDtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGVudHJ5RmlsZSwgYGltcG9ydCB7IGFwaSB9IGZyb20gJ2Nkay1zZXJ2ZXJsZXNzL2xpYi9sYW1iZGEnO1xuaW1wb3J0IHsgJHt0eXBlTmFtZX0sICR7YXJnVHlwZX0gfSBmcm9tICcuLi9nZW5lcmF0ZWQvZ3JhcGhxbC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFwaS5jcmVhdGVBcHBTeW5jSGFuZGxlcjwke2FyZ1R5cGV9LCAke3R5cGVOYW1lfVsnJHtmaWVsZE5hbWV9J10+KGFzeW5jIChjdHgpID0+IHtcbiAgY3R4LmxvZ2dlci5pbmZvKEpTT04uc3RyaW5naWZ5KGN0eC5ldmVudCkpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCB5ZXQgaW1wbGVtZW50ZWQnKTtcbn0pO2AsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKU1Jlc29sdmVyRmlsZShmbjogSnNSZXNvbHZlckNvbmZpZywgdHlwZU5hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdUeXBlID0gYCR7dHlwZU5hbWV9JHt1cHBlcmNhc2VGaXJzdChmaWVsZE5hbWUpfUFyZ3NgO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSAoZm4uaW5kZXggPT0gKGZuLnN0ZXBDb3VudCAtIDEpKSA/IGAke3R5cGVOYW1lfVsnJHtmaWVsZE5hbWV9J11gIDogJ2FueSc7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZuLmVudHJ5RmlsZSwgYGltcG9ydCB7IENvbnRleHQsIHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnO1xuaW1wb3J0IHsgJHt0eXBlTmFtZX0sICR7YXJnVHlwZX0gfSBmcm9tICcuLi9nZW5lcmF0ZWQvZ3JhcGhxbC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1tb2RlbC5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFJlcXVlc3QgZm9yICR7dHlwZU5hbWV9LiR7ZmllbGROYW1lfSAoU3RlcDogJHtmbi5uYW1lfSAke2ZuLmluZGV4ICsgMX0vJHtmbi5zdGVwQ291bnR9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHg6IENvbnRleHQ8JHthcmdUeXBlfT4pOiBhbnkge1xuICBjb25zb2xlLmxvZyhjdHgpO1xuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmVzcG9uc2UgZm9yICR7dHlwZU5hbWV9LiR7ZmllbGROYW1lfSAoU3RlcDogJHtmbi5uYW1lfSAke2ZuLmluZGV4ICsgMX0vJHtmbi5zdGVwQ291bnR9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2UoY3R4OiBDb250ZXh0PCR7YXJnVHlwZX0+KTogJHtyZXR1cm5UeXBlfSB7XG4gIGNvbnNvbGUubG9nKGN0eCk7XG4gIHJldHVybiBjdHgucmVzdWx0Lml0ZW1zO1xufWAsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgIH0pO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gdXBwZXJjYXNlRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9tYWluL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzL2xpYi91dGlsLnRzXG4gKiBhcyBpdCBpcyBub3QgZXhwb3J0ZWQgYnkgYXdzLWNkay1saWJcbiAqL1xuZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiBTcGF3blN5bmNPcHRpb25zKSB7XG4gIGNvbnN0IHByb2MgPSBzcGF3blN5bmMoY21kLCBhcmdzLCBvcHRpb25zKTtcblxuICBpZiAocHJvYy5lcnJvcikge1xuICAgIHRocm93IHByb2MuZXJyb3I7XG4gIH1cblxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICBpZiAocHJvYy5zdGRvdXQgfHwgcHJvYy5zdGRlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1N0YXR1cyAke3Byb2Muc3RhdHVzfV0gc3Rkb3V0OiAke3Byb2Muc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKX1cXG5cXG5cXG5zdGRlcnI6ICR7cHJvYy5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y21kfSAke2FyZ3Muam9pbignICcpfSAke29wdGlvbnM/LmN3ZCA/IGBydW4gaW4gZGlyZWN0b3J5ICR7b3B0aW9ucy5jd2R9YCA6ICcnfSBleGl0ZWQgd2l0aCBzdGF0dXMgJHtwcm9jLnN0YXR1c31gKTtcbiAgfVxuXG4gIHJldHVybiBwcm9jO1xufVxuXG4iXX0=
package/llm.md CHANGED
@@ -210,7 +210,7 @@ export const handler = createAppSyncHandler<GetItemQuery, Item>(async (ctx) => {
210
210
 
211
211
  HTTP errors from the shared authorizer are translated the same way. The shared `JwtAuthorizer` base throws `errors.UnauthenticatedError` (401) and `errors.ForbiddenError` (403) from `assertAuthenticated`/`assertGroup`/`assertAdmin`, and `AppSyncCognitoAuthorizer` extends that base, so these reach `createAppSyncHandler`'s catch. `createAppSyncHandler` treats any `errors.HttpError` like a typed error and maps its `statusCode` to an `errorType`: 400 `BadRequest`, 401 `Unauthorized`, 403 `Forbidden`, 404 `NotFound`, any other status `Error`. The mapped error goes through the same `APPSYNC_TYPED_ERRORS` gate and `{ __appSyncError: true, ... }` envelope as `errors.appsync.*` (with `errorInfo` undefined, since `HttpError` carries none). `src/lambda/auth.ts` and the HTTP handler `createHttpHandler` are unchanged. The same rethrow-when-not-activated rule applies, so a default UNIT resolver whose handler hits an auth assertion still fails loudly unless `typedErrors` is active.
212
212
 
213
- The envelope only becomes a GraphQL error when the resolver is wired via `GraphQlApi.addLambdaResolver` and the API opts in with `typedErrors: true`. On that path the method creates an `APPSYNC_JS` pipeline resolver whose response handler reads the envelope and calls `util.error(errorMessage, errorType, null, errorInfo)` (and `util.appendError` for invoke-level errors), turning the typed error into a GraphQL error with the matching `errorType` and `errorInfo`. Without `typedErrors: true`, `addLambdaResolver` creates a plain direct-Lambda UNIT resolver with no response handler, so the envelope is surfaced as the field's data instead. If you build the resolver yourself, replicate that response handler.
213
+ The envelope only becomes a GraphQL error when the resolver is wired via `GraphQlApi.addLambdaResolver` and the API opts in with `typedErrors: true`. On that path the method creates an `APPSYNC_JS` pipeline resolver whose response handler reads the envelope and calls `util.error(errorMessage, errorType, null, errorInfo)`, turning the typed error into a GraphQL error with the matching `errorType` and `errorInfo`. Invoke-level errors (an untyped error the handler rethrows, a timeout) are raised by the pipeline function's own response handler with `util.error(ctx.error.message, ctx.error.type)`, because AppSync drops an error left in a pipeline function's `ctx.error` and the field would resolve to `null` with no GraphQL error. Without `typedErrors: true`, `addLambdaResolver` creates a plain direct-Lambda UNIT resolver with no response handler and sets no `APPSYNC_TYPED_ERRORS` flag, so typed errors rethrow and surface as `Lambda:Unhandled`. If you build the pipeline yourself, replicate both response handlers.
214
214
 
215
215
  The response handler recognises the envelope by a reserved `__appSyncError` sentinel key that `createAppSyncHandler` stamps, not by the presence of an `errorMessage` field. A resolver whose real return type happens to include an `errorMessage` field is therefore passed through unchanged.
216
216
 
package/package.json CHANGED
@@ -101,7 +101,7 @@
101
101
  "publishConfig": {
102
102
  "access": "public"
103
103
  },
104
- "version": "3.5.0",
104
+ "version": "3.5.1",
105
105
  "jest": {
106
106
  "coverageProvider": "v8",
107
107
  "testMatch": [