@jax-data-science/sci-image-visualizer 0.2.5 → 0.2.7

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.
@@ -801,6 +801,14 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
801
801
  // crisp nearest-neighbour blocks).
802
802
  minZoomImageRatio: 0.01,
803
803
  maxZoomPixelRatio: 20,
804
+ // Switch to a finer pyramid level as soon as the current one would be
805
+ // upscaled at all. OSD's default (0.5) tolerates displaying a level at up
806
+ // to 2x magnification before fetching the next, which reads as a soft
807
+ // image that abruptly sharpens when the threshold is crossed. At 1 the
808
+ // displayed level always has at least one tile pixel per screen pixel, so
809
+ // the only visible pixellation is past 1:1 - where the blocks are genuine
810
+ // source pixels (paired with imageSmoothingEnabled=false).
811
+ minPixelRatio: 1,
804
812
  // Wait for the view to settle before pulling new tiles (less churn).
805
813
  immediateRender: false,
806
814
  animationTime: 0.4,
@@ -2011,4 +2019,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2011
2019
  type: Inject,
2012
2020
  args: [VIZ_CONFIG]
2013
2021
  }] }] });
2014
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVB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dCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdpbWFnZS1qcyc7XG5pbXBvcnQgKiBhcyBPcGVuU2VhZHJhZ29uIGZyb20gJ29wZW5zZWFkcmFnb24nO1xuaW1wb3J0IHsgT1NEIH0gZnJvbSAnLi9vc2QtbGliJztcblxuXG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFRpbGVBY2Nlc3NQb3J0LCBUSUxFX0FDQ0VTU19QT1JUIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgVml6Q29uZmlnLCBWSVpfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBMT1RfVFlQRV9ERVNDUklQVE9SUywgUGxvdFR5cGVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQgeyBJVmlzdWFsaXplciwgUGl4ZWxEYXRhLCBJbnRlbnNpdHlQcm9maWxlLCBJSXNvc3VyZmFjZUNvbnRyb2xzLCBJSW50ZW5zaXR5Q29udHJvbHMsIElTdXJmYWNlM2RDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcywgVmlld2VyRmVhdHVyZSwgY2FwYWJpbGl0aWVzT2YgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IE9zZFJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL29zZC1yZWdpb24tb3ZlcmxheSc7XG5pbXBvcnQgeyBPc2RTY2FsZUJhciB9IGZyb20gJy4vb3NkLXNjYWxlLWJhcic7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSwgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vb3NkLWNvb3JkaW5hdGUtdHJhbnNmb3JtJztcbmltcG9ydCB7IGVsZW1lbnRUb0ltYWdlLCBpbWFnZVJlY3RUb1ZpZXdwb3J0LCB2aWV3cG9ydFJlY3RUb0ltYWdlIH0gZnJvbSAnLi9vc2QtY29vcmRzJztcbmltcG9ydCB7IGJ1aWxkVGlsZVVybCwgZmV0Y2hUaWxlQml0bWFwIH0gZnJvbSAnLi90aWxlLWNsaWVudCc7XG5pbXBvcnQgeyBTbGljZUNhY2hlIH0gZnJvbSAnLi9zbGljZS1jYWNoZSc7XG5pbXBvcnQgeyBEaXNwbGF5UGlwZWxpbmUgfSBmcm9tICcuL2Rpc3BsYXktcGlwZWxpbmUnO1xuaW1wb3J0IHsgSGlzdG9ncmFtU2FtcGxlciB9IGZyb20gJy4vaGlzdG9ncmFtLXNhbXBsZXInO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgfSBmcm9tICcuLi9zaW1wbGUtc2xpY2UtYWNjZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVkSW1hZ2VEYXRhLCBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLCBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBab29tVG9Cb3hUb29sU2VydmljZSwgWm9vbVRvQm94VG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgYnVpbGRDb2xvcm1hcEx1dCwgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcblxuLyoqXG4gKiBRdWlldCBPcGVuU2VhZHJhZ29uJ3MgXCJbVmlld3BvcnQuKl0gaXMgbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2VcIiBhZHZpc29yaWVzLlxuICogQSBtdWx0aWNoYW5uZWwgaW1hZ2UgaXMgY29tcG9zaXRlZCBmcm9tIG9uZSBUaWxlZEltYWdlIHBlciBjaGFubmVsIOKAlCBhIGxlZ2l0aW1hdGVcbiAqIG11bHRpLWltYWdlIHdvcmxkIOKAlCBhbmQgT1NEIGxvZ3MgdGhhdCBhZHZpc29yeSAoYXQgZXJyb3IgbGV2ZWwpIGZyb20gaXRzIG93blxuICogbmF2aWdhdG9yL292ZXJ2aWV3IHJlbmRlcmluZyBvbiBldmVyeSBhbmltYXRpb24gZnJhbWUsIGZsb29kaW5nIHRoZSBjb25zb2xlLiBPdXJcbiAqIG93biBpbWFnZTwtPnZpZXdwb3J0IGNvbnZlcnNpb25zIGFscmVhZHkgcm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKHNlZVxuICogb3NkLWNvb3JkcyksIHNvIHRoZSByZW1haW5pbmcgYWR2aXNvcmllcyBhcmUgT1NELWludGVybmFsIGFuZCBvbmx5IGFmZmVjdCB0aGVcbiAqIG1pbmltYXAncyBib3ggYWNjdXJhY3kgKGNvc21ldGljKS4gVGhpcyB3cmFwcyBPU0QncyBsb2dnZXIgaW4gYSBQcm94eSB0aGF0IGRyb3BzXG4gKiBvbmx5IHRoYXQgb25lIG1lc3NhZ2Ugc3RyaW5nIGFuZCBmb3J3YXJkcyBldmVyeSBvdGhlciBsb2cgdW50b3VjaGVkLiBJZGVtcG90ZW50LlxuICovXG5mdW5jdGlvbiBzaWxlbmNlT3NkTXVsdGlJbWFnZUFkdmlzb3J5KCk6IHZvaWQge1xuICBjb25zdCBvc2Q6IGFueSA9IE9TRCBhcyBhbnk7XG4gIGlmIChvc2QuX19tdWx0aUltYWdlRmlsdGVySW5zdGFsbGVkKSByZXR1cm47XG4gIGNvbnN0IGJhc2U6IGFueSA9IChvc2QuY29uc29sZSAmJiB0eXBlb2Ygb3NkLmNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpXG4gICAgPyBvc2QuY29uc29sZVxuICAgIDogKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyA/IGNvbnNvbGUgOiBudWxsKTtcbiAgaWYgKCFiYXNlKSByZXR1cm47XG4gIGNvbnN0IGlzQWR2aXNvcnkgPSAoYTogdW5rbm93bikgPT5cbiAgICB0eXBlb2YgYSA9PT0gJ3N0cmluZycgJiYgYS5pbmRleE9mKCdub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZScpICE9PSAtMTtcbiAgb3NkLmNvbnNvbGUgPSBuZXcgUHJveHkoYmFzZSwge1xuICAgIGdldCh0YXJnZXQ6IGFueSwgcHJvcDogc3RyaW5nKSB7XG4gICAgICBjb25zdCBvcmlnID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgaWYgKChwcm9wID09PSAnZXJyb3InIHx8IHByb3AgPT09ICd3YXJuJykgJiYgdHlwZW9mIG9yaWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4geyBpZiAoaXNBZHZpc29yeShhcmdzWzBdKSkgcmV0dXJuOyBvcmlnLmFwcGx5KHRhcmdldCwgYXJncyk7IH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIG9yaWcgPT09ICdmdW5jdGlvbicgPyBvcmlnLmJpbmQodGFyZ2V0KSA6IG9yaWc7XG4gICAgfSxcbiAgfSk7XG4gIG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQgPSB0cnVlO1xufVxuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwgeyByZXM6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH1cblxuLyoqIFRpbGUtc291cmNlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYEdFVCAvdGlsZXMvaW5mb2AuICovXG5pbnRlcmZhY2UgVGlsZURlc2NyaXB0b3Ige1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgdGlsZVNpemU6IG51bWJlcjtcbiAgejogbnVtYmVyO1xuICBjaGFubmVsczogbnVtYmVyO1xuICAvKiogVHJ1ZSBvbmx5IGZvciBnZW51aW5lIG11bHRpLWNoYW5uZWwgY29tcG9zaXRlcyAoaW5kZXhlZC9MVVQtYmVhcmluZ1xuICAgKiAgZmx1b3Jlc2NlbmNlIHN0YWNrcykgdGhlIGNsaWVudCBzaG91bGQgc3BsaXQgaW50byBwZXItY2hhbm5lbCBsYXllcnMuIFRoZVxuICAgKiAgc2VydmVyIHNldHMgaXQ7IGFuIFJHQiBwaG90byByZWFkIGFzIHNlcGFyYXRlZCBwbGFuZXMgaGFzIGNoYW5uZWxzPjEgYnV0XG4gICAqICBtdWx0aWNoYW5uZWw9ZmFsc2UsIHNvIGl0IHN0YXlzIGEgc2luZ2xlIGNvbXBvc2l0ZSB0aWxlIHNvdXJjZS4gKi9cbiAgbXVsdGljaGFubmVsPzogYm9vbGVhbjtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbiBsZXZlbHMgYXQgdGhlIGZyb250IG9mIGBsZXZlbHNgOyB0aGUgcmVtYWluaW5nXG4gICAqICBsZXZlbHMgYXJlIHN5bnRoZXRpYyBjb21wb3NpdGVkIG92ZXJ2aWV3cyAobm8gcGVyLWNoYW5uZWwgdGlsZXMpLiAqL1xuICByZWFsTGV2ZWxzPzogbnVtYmVyO1xuICAvKiogUGVyLWNoYW5uZWwgbWV0YWRhdGEgKG5hbWUvY29sb3IvYml0RGVwdGgvbWluLW1heEFsbG93ZWQpIGZvciBuYXRpdmUgMTYtYml0XG4gICAqICB3aW5kb3dpbmcgKyBoaXN0b2dyYW07IG51bGwgZm9yIHBsYWluIDgtYml0L1JHQiBzb3VyY2VzLiAqL1xuICBjaGFubmVsSW5mbz86IEFycmF5PHtcbiAgICBuYW1lPzogc3RyaW5nOyBjb2xvcj86IHN0cmluZzsgYml0RGVwdGg/OiBudW1iZXI7IG1pbkFsbG93ZWQ/OiBudW1iZXI7IG1heEFsbG93ZWQ/OiBudW1iZXI7XG4gIH0+IHwgbnVsbDtcbiAgbGV2ZWxzOiBUaWxlTGV2ZWxbXTtcbiAgLyoqIFBoeXNpY2FsIHBpeGVsIHNpemUgaW4gwrVtICgwIHdoZW4gdGhlIGZvcm1hdCBkb2Vzbid0IHJlcG9ydCBpdCkuICovXG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IGBsb2FkKClgIGhhbmRzIHRvIGBwbG90KClgLiAqL1xuaW50ZXJmYWNlIE9zZExvYWRlZCB7XG4gIGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbDtcbiAgaW5mb0I2NDogc3RyaW5nO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNaXJyb3JzIHRoZSBsb2FkZWQgaW1hZ2UncyBmaWxlbmFtZSDigJQgdGhlIGRpYWdyYW0ncyByZW5kZXIgcGlwZWxpbmVcbiAgICogIGd1YXJkcyBvbiBgbG9hZGVkLmZpbGVuYW1lID09PSBwaGFzZUluZm8uZmlsZU5hbWVgIGJlZm9yZSBjYWxsaW5nIHBsb3QoKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpbXBsZSAobm9uLXRpbGVkKSBpbWFnZTogYHBsb3QoKWAgb3BlbnMge0BsaW5rIHVybH0gZGlyZWN0bHkgdmlhIE9TRCdzXG4gICAqICBzaW5nbGUtaW1hZ2Ugc291cmNlIOKAlCBubyB0aWxlIHB5cmFtaWQsIG5vIHNlcnZlci4gU2V0IHdoZW4gdGhlIGltYWdlXG4gICAqICBjYXJyaWVzIGB0aWxlZCA9PT0gZmFsc2VgIChzZWUge0BsaW5rIElJbWFnZUluZm8udGlsZWR9KS4gKi9cbiAgc2ltcGxlPzogYm9vbGVhbjtcbiAgLyoqIFRoZSBkaXJlY3RseS1sb2FkYWJsZSBpbWFnZSBVUkwgKGBibG9iOmAvYGRhdGE6YC9gaHR0cGApIGZvciBzaW1wbGUgbW9kZS4gKi9cbiAgdXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW5TZWFkcmFnb24gdmlzdWFsaXphdGlvbiBiYWNrZW5kLlxuICpcbiAqIFJlbmRlcnMgdGhlICppbWFnZSogcGxvdCB0eXBlIGFzIGEgbmF0aXZlbHktdGlsZWQsIHpvb21hYmxlIHJhc3RlciwgYmFja2VkIGJ5XG4gKiB0aGUgaml0LXNlcnZpY2UgdGlsZSBlbmRwb2ludHMgKGBHRVQgL3RpbGVzL2luZm9gICsgYEdFVCAvdGlsZWAsIHdoaWNoIHJldXNlXG4gKiB0aGUgQmlvLUZvcm1hdHMgUk9JIHJlbmRlcmVyKS4gUGxvdGx5IGtlZXBzIHRoZSBzY2llbnRpZmljL2RhdGEgcGxvdCB0eXBlc1xuICogKHNjYWxhciBoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLCBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpIOKAlFxuICogaGVuY2UgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgb25seSBgSW1hZ2VEaXNwbGF5YC5cbiAqXG4gKiBXaXJlZDogbG9hZCDihpIgZGVzY3JpcHRvciwgcGxvdCDihpIgbW91bnQgdmlld2VyIHdpdGggYSBjdXN0b20gdGlsZSBzb3VyY2UsXG4gKiB6b29tL3BhbiDihpIgdmlld3BvcnQgQVBJLiBOT1Qgd2lyZWQgeWV0IChmb2xsb3ctdXBzKTogcmVnaW9uIG92ZXJsYXlzICsgdG9vbHNcbiAqIChhIHBvc2l0aW9uZWQgY2FudmFzL1NWRyBvdmVybGF5IG9yIEFubm90b3Jpb3VzKSwgcGl4ZWwgcmVhZGJhY2ssIGFuZCB0aGVcbiAqIHBlci10aWxlIExVVC9jb250cmFzdCBwYXJhbXMuIE5vdCByZWdpc3RlcmVkIGluIERJIHByb3ZpZGVycyDigJQgYFBsb3RseVNlcnZpY2VgXG4gKiBpcyBzdGlsbCB0aGUgb25seSBhY3RpdmUgYmFja2VuZDsgdGhpcyBwcm92ZXMgdGhlIGNvbnRyYWN0IHN1cHBvcnRzIGEgc2Vjb25kXG4gKiBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IHJlYWwgZW5kcG9pbnRzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIC8qKiBPU0QncyBzdHJlbmd0aCBpcyBkaXNwbGF5aW5nIGEgbGFyZ2Ugem9vbWFibGUgaW1hZ2Ug4oCUIG5vdGhpbmcgZWxzZSBoZXJlLiAqL1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheV0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpOiBzdHJpbmc7XG4gIHByaXZhdGUgdmlld2VyOiBPcGVuU2VhZHJhZ29uLlZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG92ZXJsYXk6IElSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGVCYXI6IE9zZFNjYWxlQmFyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsID0gbnVsbDtcbiAgLyoqIEJhc2U2NCBSYXdGaWxlSW5mbyArIGN1cnJlbnQgei1zbGljZSwga2VwdCBzbyBzZXRaSW5kZXggY2FuIHJlYnVpbGQgdGhlXG4gICAqICB0aWxlIHNvdXJjZSBhbmQgc3dhcCBzbGljZXMgbGl2ZSAoc3RhY2sgbmF2aWdhdGlvbikuICovXG4gIHByaXZhdGUgaW5mb0I2NCA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRaID0gMDtcbiAgLyoqIFRydWUgd2hpbGUgdGhlIGN1cnJlbnQgaW1hZ2UgaXMgXCJzaW1wbGVcIiAodGlsZWQ6ZmFsc2Ug4oCUIHNlbGYtY29udGFpbmVkXG4gICAqICBwZXItc2xpY2UgVVJMcywgbm8gdGlsZSBzZXJ2ZXI7IGUuZy4gYSBudW1iZXJlZCBpbWFnZSBzZXJpZXMgYXNzZW1ibGVkXG4gICAqICBjbGllbnQtc2lkZSBpbnRvIGEgc3RhY2spLiBzZXRaSW5kZXggc3dhcHMgdGhlIHNpbmdsZS1pbWFnZSBzb3VyY2UgZm9yXG4gICAqICB0aGUgbmV3IHNsaWNlJ3MgVVJMIGluc3RlYWQgb2YgdXBkYXRpbmcgYSB0aWxlZCB6LXBhcmFtLiAqL1xuICBwcml2YXRlIHNpbXBsZU1vZGUgPSBmYWxzZTtcbiAgLyoqIHVybHNbXSBmb3IgdGhlIGN1cnJlbnQgc2ltcGxlLW1vZGUgaW1hZ2UsIHNvIHNldFpJbmRleCBjYW4gbG9vayB1cCB0aGVcbiAgICogIHNsaWNlIGJlaW5nIHNjcnViYmVkIHRvICh2aWEge0BsaW5rIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZS51cmxGb3J9KS5cbiAgICogIFVudXNlZCAoYW5kIGxlZnQgc3RhbGUsIGhhcm1sZXNzbHkpIGluIHRpbGVkIG1vZGUuICovXG4gIHByaXZhdGUgc2ltcGxlVXJsczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIHByZXZpZXcgYmxvYiBVUkwg4oaSIGZ1bGwtcmVzIHVwc2NhbGVkIGJsb2IgVVJMIChzZWUgdG9GdWxsUmVzVXJsKSwgc29cbiAgICogIHJlLXZpc2l0aW5nIGEgc2ltcGxlLW1vZGUgc2xpY2UgZG9lc24ndCByZS11cHNjYWxlLiBSZXZva2VkIG9uIGZpbGUgY2hhbmdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNpbXBsZUZ1bGxSZXNVcmxzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxDb3VudD4xKTogdGhlIHN0YWNrJ3NcbiAgICogIHBlci1zbGljZSBwZXItY2hhbm5lbCBwbGFuZSBVUkxzLCB0aGUgY3VycmVudCBzbGljZSdzIGRlY29kZWQgcGxhbmVzLCBhbmRcbiAgICogIHRoZSBsYXN0IGNvbXBvc2l0ZSBibG9iIFVSTC4gQ29tcG9zaXRlZCBjbGllbnQtc2lkZSB2aWEgZGlzcGxheS5jaGFubmVsUmdiTHV0XG4gICAqICAobm8gdGlsZSBzZXJ2ZXIpOyBrZXB0IE9GRiB0aGUgdGlsZWQgaXNNdWx0aUNoYW5uZWwgcGF0aC4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzaW1wbGVDaGFubmVsVXJsczogc3RyaW5nW11bXSA9IFtdO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxQbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ29tcG9zaXRlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNraXAgdGhlIGZ1bGwtcmVzIHVwc2NhbGUgYWJvdmUgdGhpcyBsb25nZXN0LXNpZGUgZGltZW5zaW9uIOKAlCBhIGZvbGRlclxuICAgKiAgc3RhY2sgaXMgcGVyLWZpbGUgcHJldmlld3MgKHdlbGwgdW5kZXIgdGhpcyk7IHRoaXMgb25seSBndWFyZHMgYWdhaW5zdCBhblxuICAgKiAgYWNjaWRlbnRhbCBlbm9ybW91cyBjYW52YXMgYWxsb2NhdGlvbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBTSU1QTEVfVVBTQ0FMRV9NQVhfRElNID0gODE5MjtcbiAgcHJpdmF0ZSBjb29yZFRyYW5zZm9ybTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3YW5kSG9zdCE6IFdhbmRUb29sSG9zdDtcbiAgcHJpdmF0ZSBlcmFzZXJIb3N0ITogVmVydGV4RXJhc2VyVG9vbEhvc3Q7XG4gIC8qKiBXYW5kIHNhbXBsaW5nIG1hdHJpeCByZWFkIGJhY2sgZnJvbSB0aGUgcmVuZGVyZWQgdmlld3BvcnQ7IGNhY2hlZCB1bnRpbFxuICAgKiAgdGhlIHZpZXdwb3J0IGNoYW5nZXMgKHNlZSByZWFkYmFja1ZpZXdwb3J0KS4gKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFBpeGVsczogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgRE9NIGlkIG9mIHRoZSBlbGVtZW50IE9TRCBpcyBtb3VudGVkIGluIChzaGFyZWQgd2l0aCBQbG90bHkpOyB0aGVcbiAgICogIG9uLWNhbnZhcyB0b29scyBhdHRhY2ggdGhlaXIgb3ZlcmxheXMgaGVyZS4gKi9cbiAgcHJpdmF0ZSBwbG90RGl2ID0gJyc7XG4gIC8qKiBDdXJyZW50IGZpbGUgbmFtZSwgdGFnZ2VkIG9udG8gd2FuZC1jcmVhdGVkIHNoYXBlcy4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50RmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIDI1Ni1lbnRyeSBSR0IgTFVUIGZvciB0aGUgYWN0aXZlIGNvbG9ybWFwLCBhcHBsaWVkIHRvIGdyYXlzY2FsZSB0aWxlcyB2aWFcbiAgICogIHRoZSB0aWxlLWludmFsaWRhdGVkIHBpeGVsIHBpcGVsaW5lIChtaXJyb3JzIFBsb3RseSdzIGhlYXRtYXAgY29sb3JzY2FsZSkuXG4gICAqICBOdWxsIHdoaWxlIG9wdGlvbnMgcmVzb2x2ZTsgcmVjb2xvcmluZyBpcyBza2lwcGVkIHVudGlsIGl0J3MgYnVpbHQuICovXG4gIHByaXZhdGUgY29sb3JMdXQ6IFJnYltdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPbmx5IGdyYXlzY2FsZSBpbWFnZXMgZ2V0IGEgY29sb3JtYXAgKFJHQiB0aWxlcyBwYXNzIHRocm91Z2ggdW50b3VjaGVkKS4gKi9cbiAgcHJpdmF0ZSBpc0dyYXlzY2FsZUltYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgY29sb3JtYXBTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIGJ5IGV2ZXJ5IGRpc3BsYXkgaW52YWxpZGF0aW9uLiBBIHJlY29sb3Igcm91bmQgY2FwdHVyZXMgaXQgYW5kLCBhZnRlclxuICAgKiAgZWFjaCBgYXdhaXRgLCBhYmFuZG9ucyB0aGUgdGlsZSBvbmNlIGEgbmV3ZXIgcm91bmQgaGFzIHN0YXJ0ZWQuIFdyaXRpbmcgYVxuICAgKiAgc3VwZXJzZWRlZCBjb250ZXh0IGJhY2sgaXMgbm90IG1lcmVseSB3YXN0ZWQgd29yazogT1NEJ3MgY29udmVyc2lvbiBzZWVzIGFcbiAgICogIGNhbnZhcyB0aGUgbmV3ZXIgcm91bmQgYWxyZWFkeSByZXBsYWNlZCwgdGhyb3dzIGBET01FeGNlcHRpb25gLCBhbmRcbiAgICogIGBfaGFuZGxlQ29udmVyc2lvbkVycm9yYCBERVNUUk9ZUyB0aGUgY2FjaGUgcmVjb3JkIGFuZCB1bmxvYWRzIHRoZSB0aWxlXG4gICAqICAodW5saWtlIHRoZSBkcmF3ZXIncyByYXN0ZXJCbG9iIHBhdGgsIGl0IGRvZXMgbm90IHJlLXByZXBhcmUpLiBFbm91Z2ggb2ZcbiAgICogIHRob3NlIGFuZCB0aGUgdmlld2VyIGdvZXMgd2hpdGUgbWlkLWRyYWcuICovXG4gIHByaXZhdGUgZGlzcGxheVRva2VuID0gMDtcbiAgLyoqIFBlbmRpbmcgY29hbGVzY2VkIGludmFsaWRhdGlvbiAoc2VlIHtAbGluayBzY2hlZHVsZUludmFsaWRhdGV9KS4gKi9cbiAgcHJpdmF0ZSBpbnZhbGlkYXRlSGFuZGxlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBwZXItY2hhbm5lbCBkaXNwbGF5IHN0YXRlICh3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSkgZnJvbSB0aGUgc3RvcmUsXG4gICAqICByZWFkIHN5bmNocm9ub3VzbHkgYnkgcmVjb2xvclRpbGUuIENoYW5uZWwgMCBkcml2ZXMgZ3JheXNjYWxlIHdpbmRvd2luZztcbiAgICogIFIvRy9CIChpbmRpY2VzIDAtMikgZHJpdmUgUkdCIHBlci1jaGFubmVsIHdpbmRvd2luZy4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsU3RhdGVzOiBJQ2hhbm5lbFN0YXRlW10gPSBbXTtcbiAgLyoqIFRydWUgZm9yIG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGNoYW5uZWxDb3VudCA+IDEsIG5vdCBSR0IpOiB0aWxlcyBhcmVcbiAgICogIGNvbXBvc2l0ZWQgY2xpZW50LXNpZGUgZnJvbSBwZXItY2hhbm5lbCBzaW5nbGUtYmFuZCBmZXRjaGVzIChzZWVcbiAgICogIHJlY29sb3JNdWx0aUNoYW5uZWxUaWxlKSByYXRoZXIgdGhhbiByZWNvbG9yZWQgaW4gcGxhY2UuICovXG4gIHByaXZhdGUgaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIENvdW50IG9mIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbiBsZXZlbHMgKHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHlcbiAgICogIGhlcmUpLiBGb3IgbXVsdGljaGFubmVsIGltYWdlcyB0aGUgdGlsZSBzb3VyY2UgaXMgYnVpbHQgZnJvbSB0aGVzZSBhbG9uZSBzb1xuICAgKiAgZXZlcnkgZGlzcGxheWVkIHRpbGUgc3VwcG9ydHMgYSBwZXItY2hhbm5lbCBmZXRjaC4gKi9cbiAgcHJpdmF0ZSByZWFsTGV2ZWxzID0gMDtcbiAgLyoqIEludmVydGVkIGJhY2tncm91bmQgKHdoaXRlID0gemVybyk6IGludmVydHMgdGhlIGRpc3BsYXkgdmFsdWUgYmVmb3JlIHRoZVxuICAgKiAgTFVUIChncmF5c2NhbGUpIC8gcGVyIGNoYW5uZWwgKFJHQikuICovXG4gIHByaXZhdGUgaW52ZXJ0QmcgPSBmYWxzZTtcbiAgLyoqIEJlYXJlciB0b2tlbiBmb3IgT1NEJ3Mgb3duIHRpbGUgZmV0Y2hlcyAoSHR0cENsaWVudCBjYWxscyBnZXQgaXQgdmlhIHRoZVxuICAgKiAgaW50ZXJjZXB0b3I7IE9TRCdzIGxvYWRlciBkb2VzIG5vdCwgc28gd2UgcGFzcyBpdCBhcyBhbiBhamF4IGhlYWRlcikuICovXG4gIHByaXZhdGUgYXV0aEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLyoqIFdoZXRoZXIgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAobWluaW1hcCkgaXMgc2hvd24uIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uO1xuICAgKiAgYSBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FudCBpdCAoZS5nLiBhIHNtYWxsIGVtYmVkZGVkIHByZXZpZXcpIHNldHMgaXQgb2ZmXG4gICAqICB2aWEge0BsaW5rIHNldE5hdmlnYXRvclZpc2libGV9IGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclZpc2libGUgPSB0cnVlO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhcikuIGBmYWxzZWAg4oaSIG5lYXJlc3QtbmVpZ2hib3VyLCBzbyB6b29tZWQtaW4gcGl4ZWxzXG4gICAqICByZW5kZXIgYXMgY3Jpc3AgYmxvY2tzIChwaXhlbCBpbnNwZWN0aW9uKS4gRGVmYXVsdHMgdG8gYGZhbHNlYCBzbyB0aGUgaW1hZ2VcbiAgICogIG9wZW5zIHNob3dpbmcgcmF3IHBpeGVscy4gUmVhZCBhdCB2aWV3ZXIgY3JlYXRpb247IHRvZ2dsZWQgdmlhXG4gICAqICB7QGxpbmsgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkfS4gKi9cbiAgcHJpdmF0ZSBzbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgLyoqIE92ZXJhbGwgZGVhZGxpbmUgZm9yIHRoZSAvdGlsZXMvaW5mbyBwb2xsIGxvb3AuIEFuIHVuY2FjaGVkIHdob2xlLXNsaWRlXG4gICAqICBpbWFnZSAoZS5nLiAubmRwaSkgaXMgY2FjaGVkIHNlcnZlci1zaWRlIGZpcnN0IChHQ1MtPlBWQyksIHdoaWNoIGNhbiB0YWtlXG4gICAqICBzZXZlcmFsIG1pbnV0ZXMg4oCUIHdlIHBvbGwgKHNob3J0IHJlcXVlc3RzOyB0aGUgY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheVxuICAgKiAgc2hvd3MgdGhlIHdhaXQpIHVudGlsIGl0J3MgcmVhZHkuIEdlbmVyb3VzIGJlY2F1c2UgZWFjaCBwb2xsIGlzIGNoZWFwOyBvblxuICAgKiAgZXhwaXJ5IHRoZSByZW5kZXIgcGlwZWxpbmUgZ2l2ZXMgdXAgYW5kIHRoZSByb3V0ZXIgZmFsbHMgYmFjayB0byBQbG90bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXNJbmZvVGltZW91dE1zID0gNjAwMDAwOyAvLyAxMCBtaW5cblxuICAvKiogUGVyLWNoYW5uZWwgZml0LXZpZXcgdGlsZSBidWRnZXQgKHRpbGVzIGF0IHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIMOXIGNoYW5uZWxzKS5cbiAgICogIEFib3ZlIGl0LCBhIG11bHRpY2hhbm5lbCBpbWFnZSByZW5kZXJzIHNlcnZlci1jb21wb3NpdGVkIGluc3RlYWQgb2YgcGVyLWNoYW5uZWxcbiAgICogIOKAlCBpdHMgZnVsbC1yZXMgcmVhZHMgKGl0IGhhcyBubyBvdmVydmlldyBweXJhbWlkKSB3b3VsZCBiZSB0b28gbWFueSDDlyBOIGNoYW5uZWxzLlxuICAgKiAgNjQgKGUuZy4gYSA0eDQgc2luZ2xlLUZPViB6LXN0YWNrIMOXIDRjaCkgc3RheXMgcGVyLWNoYW5uZWw7IGEgd2hvbGUtc2xpZGVcbiAgICogIChodW5kcmVkc+KAk3Rob3VzYW5kcykgZmFsbHMgYmFjay4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFUyA9IDI1NjtcblxuICAvKiogUGl4ZWwgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2ludmVydC9jb2xvcm1hcCArIGFkZGl0aXZlIHRpbnQpIOKAlFxuICAgKiAgc2hhcmVkIGJ5IHRpbGUgcmVjb2xvcmluZyBhbmQgdGhlIGNvbXBvc2l0ZSBleHBvcnQgc28gdGhleSBzdGF5IGlkZW50aWNhbFxuICAgKiAgKHNlZSBEaXNwbGF5UGlwZWxpbmUpLiBIb3N0IGNsb3N1cmVzIHJlYWQgdGhlIHNlcnZpY2UncyBsaXZlIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5ID0gbmV3IERpc3BsYXlQaXBlbGluZSh7XG4gICAgaXNHcmF5c2NhbGU6ICgpID0+IHRoaXMuaXNHcmF5c2NhbGVJbWFnZSxcbiAgICBjb2xvckx1dDogKCkgPT4gdGhpcy5jb2xvckx1dCxcbiAgICBjaGFubmVsU3RhdGVzOiAoKSA9PiB0aGlzLmNoYW5uZWxTdGF0ZXMsXG4gICAgaW52ZXJ0Qmc6ICgpID0+IHRoaXMuaW52ZXJ0QmcsXG4gIH0pO1xuXG4gIC8qKiBIaXN0b2dyYW0gKyBhdXRvLXdpbmRvdyBzYW1wbGluZyAoc2VlIEhpc3RvZ3JhbVNhbXBsZXIpLiBDb25zdHJ1Y3RlZCBpblxuICAgKiAgdGhlIGN0b3IgYm9keSBiZWNhdXNlIGl0IGNhcHR1cmVzIHRoZSByZXNvbHZlZCBBUEkgYmFzZSBVUkwuICovXG4gIHByaXZhdGUgc2FtcGxlciE6IEhpc3RvZ3JhbVNhbXBsZXI7XG5cbiAgLyoqIFN0YWNrLXNsaWNlIGNhY2hlICsgYmFja2dyb3VuZCBwcmVsb2FkZXIgKHNlZSBTbGljZUNhY2hlIOKAlCByZWZhY3RvcmluZ1xuICAgKiAgcGxhbiBTdGVwIDMpLiBUaGUgaG9zdCBhY2Nlc3NvcnMgYXJlIGxpdmUgY2xvc3VyZXMsIHNvIHRoZSBjYWNoZSBhbHdheXNcbiAgICogIHJlYWRzIHRoZSBzZXJ2aWNlJ3MgY3VycmVudCB2aWV3ZXIvZGVzY3JpcHRvci96IOKAlCBleGFjdGx5IHRoZSBmaWVsZHMgdGhlXG4gICAqICBtb3ZlZCBjb2RlIHVzZWQgdG8gcmVhZCBkaXJlY3RseS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBTbGljZUNhY2hlKHtcbiAgICB2aWV3ZXI6ICgpID0+IHRoaXMudmlld2VyLFxuICAgIGhhc0ltYWdlOiAoKSA9PiAhISh0aGlzLnZpZXdlciAmJiB0aGlzLmRlc2NyaXB0b3IgJiYgdGhpcy5pbmZvQjY0KSxcbiAgICBzbGljZUNvdW50OiAoKSA9PiB0aGlzLmRlc2NyaXB0b3I/LnogPz8gMSxcbiAgICBjdXJyZW50WjogKCkgPT4gdGhpcy5jdXJyZW50WixcbiAgICBpc011bHRpQ2hhbm5lbDogKCkgPT4gdGhpcy5pc011bHRpQ2hhbm5lbCxcbiAgICBjaGFubmVsQ291bnQ6ICgpID0+IE1hdGgubWF4KDEsIHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKHRoaXMuZGVzY3JpcHRvcj8uY2hhbm5lbHMgPz8gMSkpLFxuICAgIGNoYW5uZWxWaXNpYmxlOiAoYzogbnVtYmVyKSA9PiB0aGlzLmNoYW5uZWxTdGF0ZXNbY10/LnZpc2libGUgIT09IGZhbHNlLFxuICAgIGJ1aWxkVGlsZVNvdXJjZTogKHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYnVpbGRUaWxlU291cmNlKHRoaXMuZGVzY3JpcHRvciEsIHRoaXMuaW5mb0I2NCwgeiwgY2hhbm5lbCksXG4gICAgb25Db21wb3NpdGVTbGljZUFkZGVkOiAoejogbnVtYmVyKSA9PiB0aGlzLnNhbXBsZXIuY29tcHV0ZUltYWdlV2luZG93KHRoaXMuZGVzY3JpcHRvciEsIHRoaXMuaW5mb0I2NCwgeiksXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBASW5qZWN0KFRJTEVfQUNDRVNTX1BPUlQpIHByaXZhdGUgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHByaXZhdGUgd2FuZFRvb2w6IFdhbmRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZSxcbiAgICBwcml2YXRlIHNpbXBsZVN0YWNrOiBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBjb25maWc6IFZpekNvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIocmVnaW9uU3RvcmUsIHN0b3JlKTtcbiAgICB0aGlzLmFwaSA9IGNvbmZpZy5zbGlkZUNyb3BTZXJ2ZXI7XG4gICAgdGhpcy5zYW1wbGVyID0gbmV3IEhpc3RvZ3JhbVNhbXBsZXIodGhpcy5odHRwLCB0aGlzLmFwaSwge1xuICAgICAgcmVhbExldmVsczogKCkgPT4gdGhpcy5yZWFsTGV2ZWxzLFxuICAgICAgY2hhbm5lbENvdW50OiAoZCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aCB8fCAoZC5jaGFubmVscyA/PyAxKSxcbiAgICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgICAvLyBOdWRnZSB0aGUgY2hhbm5lbC1zdGF0ZXMgc3RyZWFtIHNvIHRoZSBwYW5lIHJlLXJlYWRzIGdldEhpc3RvZ3JhbSBub3csXG4gICAgICAvLyBpbiBjYXNlIGl0cyBib3VuZGVkIHJldHJ5IHdpbmRvdyBhbHJlYWR5IGxhcHNlZC5cbiAgICAgIG9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkOiAoKSA9PiB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZXModGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpKSxcbiAgICAgIG9uR3JheVdpbmRvd1NhbXBsZWQ6IChtaW4sIG1heCkgPT4gdGhpcy5zZWVkR3JheVdpbmRvdyhtaW4sIG1heCksXG4gICAgfSk7XG4gICAgdGhpcy5lbnN1cmVDb2xvcm1hcFN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9zY2FsZUV2ZW50JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcykgZW1pdHRlZCB3aGVuIHRoZSB2aWV3XG4gICAqICBzZXR0bGVzLCBzbyB0aGUgaW50ZW5zaXR5IGluc2V0IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PigpO1xuICAvLyBSZWdpb24gc3RhdGUgKHJlZ2lvbnMsIHNlbGVjdGlvbiwgdGhlIHVwZGF0ZSBldmVudCkgbGl2ZXMgaW4gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZTsgdGhlIElSZWdpb25TdG9yZSBtZXRob2RzIGJlbG93IGRlbGVnYXRlIHRvIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVByb2ZpbGUkID0gbmV3IFN1YmplY3Q8SW50ZW5zaXR5UHJvZmlsZVtdPigpO1xuICAvLyBJbWFnZSBtZXRhZGF0YSBhbmQgY2xhc3NpZmljYXRpb24gY29sb3VycyBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLlxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgY29sb3JtYXAvcmV2ZXJzZSBzbyBPU0QgcmVjb2xvcnMgaW5cbiAgICogbG9jay1zdGVwIHdpdGggUGxvdGx5LiBJZGVtcG90ZW50IGFuZCBzZWxmLWhlYWxpbmc6IHRoaXMgc2VydmljZSBpcyBhIHJvb3RcbiAgICogc2luZ2xldG9uLCBidXQgYHVuc3Vic2NyaWJlKClgIChjYWxsZWQgb24gVmlzdWFsaXplckNvbXBvbmVudCBkZXN0cm95KVxuICAgKiB0ZWFycyB0aGUgc3Vic2NyaXB0aW9uIGRvd24g4oCUIGFuZCB0aGUgY29uc3RydWN0b3IgbmV2ZXIgcnVucyBhZ2Fpbi4gU29cbiAgICogYHBsb3QoKWAgY2FsbHMgdGhpcyB0byByZS1lc3RhYmxpc2ggaXQgYWZ0ZXIgYSBjb21wb25lbnQgdGVhcmRvd24vcmVjcmVhdGVcbiAgICogKGUuZy4gc3dpdGNoaW5nIGltYWdlcyksIG90aGVyd2lzZSBjb2xvcm1hcCBjaGFuZ2VzIHdvdWxkIGJlIHNpbGVudGx5XG4gICAqIGRyb3BwZWQgb24gZXZlcnkgaW1hZ2UgYWZ0ZXIgdGhlIGZpcnN0IHN3aXRjaC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29sb3JtYXBTdWIpIHJldHVybjtcbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlXG4gICAgLy8gb2YgdHJ1dGggZm9yIGJvdGggYmFja2VuZHMuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjaGFuZ2VzLCBzbyBPU0QgcmVjb2xvcnMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgKyBwZXItY2hhbm5lbCB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSArIGludmVydCBhbGwgbGl2ZSBpblxuICAgIC8vIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBhbnkgb2YgdGhlbSBjaGFuZ2VzLCBzbyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB1cGRhdGVzIHRoZVxuICAgIC8vIGltYWdlIGxpdmUgYW5kIE9TRCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjbSwgcmV2LCBjaGFubmVscywgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jb2xvckx1dCA9IGJ1aWxkQ29sb3JtYXBMdXQoY20/LmRhdGE/LnZhbHVlLCAhIXJldik7XG4gICAgICB0aGlzLmNoYW5uZWxTdGF0ZXMgPSBjaGFubmVscztcbiAgICAgIHRoaXMuaW52ZXJ0QmcgPSAhIWludmVydDtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsOiByZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkXG4gICAgICAvLyBwbGFuZXMgd2l0aCB0aGUgbmV3IGNoYW5uZWwgc3RhdGVzICsgcmUtb3BlbiAobm8gdGlsZS1pbnZhbGlkYXRlIHBhdGgpLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7IHZvaWQgdGhpcy5yZWNvbXBvc2l0ZUFuZE9wZW4oKTsgcmV0dXJuOyB9XG4gICAgICAvLyBNdWx0aWNoYW5uZWw6IGVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIFRpbGVkSW1hZ2Ug4oCUIHZpc2liaWxpdHkgaXMgdGhlXG4gICAgICAvLyBpbWFnZSdzIG9wYWNpdHkgKHdpbmRvdy9nYW1tYS9jb2xvdXIgYXJlIGFwcGxpZWQgYnkgcmVjb2xvckNoYW5uZWxUaWxlXG4gICAgICAvLyBvbiB0aGUgaW52YWxpZGF0ZSBiZWxvdykuIFJlLWFwcGx5aW5nIHRoZSBjdXJyZW50IHNsaWNlJ3MgcmV2ZWFsIHBpY2tzIHVwXG4gICAgICAvLyB0aGUgbmV3IHBlci1jaGFubmVsIHZpc2liaWxpdHkgKGNhY2hlZCBzbGljZXMgc3RheSBoaWRkZW4pLlxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5yZXZlYWxDaGFubmVsU2xpY2UodGhpcy5jdXJyZW50Wik7XG4gICAgICB9XG4gICAgICAvLyByZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKSByZXN0b3JlcyBlYWNoIHRpbGUgdG8gaXRzIG9yaWdpbmFsIGRhdGEgYmVmb3JlXG4gICAgICAvLyByZS1ydW5uaW5nIHJlY29sb3JUaWxlLCBzbyBhIGNoYW5nZSBhbHdheXMgbWFwcyBhZnJlc2ggKG5vIGNvbXBvdW5kaW5nKS5cbiAgICAgIC8vIFJHQiBub3cgcmVjb2xvcnMgdG9vIChwZXItY2hhbm5lbCB3aW5kb3cvdmlzaWJpbGl0eSksIHNvIGRvbid0IGdhdGUgb25cbiAgICAgIC8vIGdyYXlzY2FsZS4gQ29hbGVzY2VkOiBQcmltZU5HJ3Mgc2xpZGVyIGZpcmVzIChvbkNoYW5nZSkgY29udGludW91c2x5LCBzb1xuICAgICAgLy8gYSBzaW5nbGUgZHJhZyB3b3VsZCBvdGhlcndpc2UgcXVldWUgZG96ZW5zIG9mIG92ZXJsYXBwaW5nIHJlc3RvcmUgK1xuICAgICAgLy8gcmUtcHJvY2VzcyByb3VuZHMgb3ZlciBldmVyeSBjaGFubmVsIGltYWdlLlxuICAgICAgdGhpcy5zY2hlZHVsZUludmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZWVkIHRoZSBJbnRlbnNpdHkgY2hhbm5lbCB3aXRoIGEgbWVhc3VyZWQgYXV0by13aW5kb3cgd2hpbGUgaXQncyBzdGlsbFxuICAgKiAgYXQgZnVsbCByYW5nZSAobmV2ZXIgY2xvYmJlciB0aGUgdXNlcidzIG1hbnVhbCB3aW5kb3cpOyBpZiB0aGUgdXNlclxuICAgKiAgYWxyZWFkeSB3aW5kb3dlZCwganVzdCByZS1pbnZhbGlkYXRlIHNvIHBhaW50ZWQgdGlsZXMgcGljayB0aGUgTFVUIHVwLiAqL1xuICBwcml2YXRlIHNlZWRHcmF5V2luZG93KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNoMCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICBpZiAoY2gwICYmIGNoMC5taW4gPT09IDAgJiYgY2gwLm1heCA9PT0gMjU1KSB7XG4gICAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZSgwLCB7IG1pbiwgbWF4IH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5jb2xvckx1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSB0aWxlLXNvdXJjZSBkZXNjcmlwdG9yIGZvciB0aGUgc2VsZWN0ZWQgZmlsZS4gVGhlIGBpbmZvYCBwYXJhbSBpc1xuICAgKiB0aGUgYmFzZTY0IFJhd0ZpbGVJbmZvIHRoZSByZXN0IG9mIHRoZSBBUEkgdXNlczsgdGhlIEdFVCBnb2VzIHRocm91Z2ggdGhlXG4gICAqIGF1dGggaW50ZXJjZXB0b3IgKEJlYXJlcikuIFdlIGFsc28gZ3JhYiBhIHRva2VuIGhlcmUgZm9yIE9TRCdzIG93biB0aWxlXG4gICAqIGZldGNoZXMgKGl0cyBsb2FkZXIgYnlwYXNzZXMgSHR0cENsaWVudCkuXG4gICAqL1xuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICAvLyBBIGRpZmZlcmVudCBpbWFnZSB3YXMgc2VsZWN0ZWQg4oCUIHN0b3AgdGhlIHByZXZpb3VzIHN0YWNrJ3MgYmFja2dyb3VuZFxuICAgIC8vIGxvYWRpbmcgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBmaW5pc2ggYmVoaW5kIHRoZSBuZXcgaW1hZ2UuXG4gICAgaWYgKGZpbGVuYW1lICYmIHRoaXMuY3VycmVudEZpbGVOYW1lICYmIGZpbGVuYW1lICE9PSB0aGlzLmN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgICAgdGhpcy5yZXZva2VTaW1wbGVGdWxsUmVzVXJscygpO1xuICAgIH1cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGZpbGVuYW1lKTtcbiAgICAvLyBTaW1wbGUgKGluLW1lbW9yeSAvIG5vbi10aWxlZCkgaW1hZ2U6IHNraXAgdGhlIHRpbGUgc2VydmVyIGVudGlyZWx5IOKAlCBub1xuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCwgbm8gL3RpbGVzL2luZm8gcG9sbC4gYHVybHNbekluZGV4XWAgaXMgYSBjb21wbGV0ZSBpbWFnZVxuICAgIC8vIE9TRCBvcGVucyB2aWEgaXRzIHNpbmdsZS1pbWFnZSBzb3VyY2UgKHNlZSBwbG90KCkpLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGltYWdlSW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRTaW1wbGUoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlcy5nZXRBdXRoSGVhZGVycygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9OyAvLyBmYWxsIGJhY2sgdG8gY29va2llIGF1dGggKGFqYXhXaXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICAgIC8vIFBvbGwgL3RpbGVzL2luZm86IHRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2UgZmlsZSBpcyBzdGlsbFxuICAgIC8vIGJlaW5nIGNhY2hlZCAoR0NTLT5QVkMpIOKAlCBpdCBraWNrcyB0aGUgZG93bmxvYWQgb2ZmIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGVhY2ggcmVxdWVzdCBpcyBzaG9ydCAobm8gbG9uZy1oZWxkIGNvbm5lY3Rpb24gdG8gdHJpcCBpbmdyZXNzL3Byb3h5IG9yXG4gICAgLy8gY2xpZW50IHRpbWVvdXRzKSwgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgaXQncyByZWFkeS4gVGhlXG4gICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSBzaG93cyBwcm9ncmVzcyBkdXJpbmcgdGhlIHdhaXQuIFdlIGdpdmUgdXAgYWZ0ZXJcbiAgICAvLyB0aWxlc0luZm9UaW1lb3V0TXMgc28gdGhlIHJlbmRlciBwaXBlbGluZSBuZXZlciBoYW5ncyAodGhlIHJvdXRlciB0aGVuXG4gICAgLy8gZmFsbHMgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UpLlxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfXRpbGVzL2luZm8/aW5mbz0ke2luZm9CNjR9YDtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLnRpbGVzSW5mb1RpbWVvdXRNcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGlsZXMvaW5mbyBub3QgcmVhZHkgYmVmb3JlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmcnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PFRpbGVEZXNjcmlwdG9yPih1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKHRpbWVvdXQoNDUwMDApKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDAgJiYgcmVzcC5ib2R5KSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gcmVzcC5ib2R5O1xuICAgICAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IHJlc3AuYm9keSwgaW5mb0I2NCwgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gMjAyIEFjY2VwdGVkIChvciBlbXB0eSBib2R5KSDihpIgc3RpbGwgY2FjaGluZzsgZmFsbCB0aHJvdWdoIGFuZCByZS1wb2xsLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFRvbGVyYXRlIHRyYW5zaWVudCBmYWlsdXJlcyBXSElMRSB0aGUgZmlsZSBpcyBiZWluZyBwcmVwYXJlZDogYSBzbG93XG4gICAgICAgIC8vIG1ldGFkYXRhIHJlYWQgb24gYSBtdWx0aS1HQiBmaWxlIChJRkQgd2FsayksIGEgNXh4IG1pZC1waXBlbGluZSwgYVxuICAgICAgICAvLyBwcm94eSBoaWNjdXAuIEEgc2luZ2xlIGJhZCBwb2xsIG11c3QgTk9UIGRyb3AgdXMgdG8gUGxvdGx5IOKAlCBhIGxhcmdlXG4gICAgICAgIC8vIGltYWdlIGFsd2F5cyBwYXNzZXMgdGhyb3VnaCB0aGlzIGJ1c3kgd2luZG93LCBzbyBiYWlsaW5nIGhlcmUgaXMgd2h5XG4gICAgICAgIC8vIGl0IFwiYWx3YXlzIGVuZHMgdXAgb24gUGxvdGx5XCIuIEtlZXAgcG9sbGluZyB1bnRpbCByZWFkeSBvciBkZWFkbGluZS5cbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTUwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgYHBsb3QoKWAgcGF5bG9hZCBmb3IgYSBzaW1wbGUgKHRpbGVkOmZhbHNlKSBpbWFnZTogYSBzaW5nbGUtbGV2ZWxcbiAgICogIGRlc2NyaXB0b3Igc2l6ZWQgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAsIHBsdXMgdGhlIGRpcmVjdGx5LWxvYWRhYmxlIFVSTCDigJRcbiAgICogIHJlc29sdmVkIGFuZCBmZXRjaGVkIHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlfSAoc2hhcmVkIHdpdGhcbiAgICogIG5hcGFyaS1qczsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIHJhdyBgZmV0Y2goKWAvYDxpbWc+YCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZShpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgY29uc3QgbWV0YSA9IGltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICAvLyBTRVJWRVJMRVNTIE1VTFRJQ0hBTk5FTDogY29tcG9zaXRlIHRoZSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lc1xuICAgIC8vIGNsaWVudC1zaWRlIChubyB0aWxlIHNlcnZlciksIGRyaXZlbiBieSB0aGUgY2hhbm5lbCBwYW5lLiBLZXB0IE9GRiB0aGVcbiAgICAvLyB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoIChzZWUgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKS5cbiAgICBjb25zdCBjaFVybHMgPSBpbWFnZUluZm8uY2hhbm5lbFVybHM7XG4gICAgdGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwgPSAhIWNoVXJscz8ubGVuZ3RoICYmIChtZXRhPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGxldCB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBjaFVybHMgYXMgc3RyaW5nW11bXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXMoY2hVcmxzIVt6XSA/PyBjaFVybHMhWzBdKTtcbiAgICAgICAgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgLy8gTkI6IGhpc3RvZ3JhbXMgYXJlIGJpbm5lZCBpbiBwbG90KCksIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgY2xlYXJzIHRoZVxuICAgICAgICAvLyBzYW1wbGVyIOKAlCBjb21wdXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHdpcGVkIGJ5IHRoYXQgY2xlYXIuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gW107XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJhd1VybCA9IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGltYWdlSW5mbywgeik7XG4gICAgICBpZiAocmF3VXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKTtcbiAgICAgICAgICAvLyBVcHNjYWxlIHRoZSAoZG93bnNjYWxlZCkgcHJldmlldyB0byBmdWxsIHJlc29sdXRpb24gc28gT1NEJ3Mgd29ybGRcbiAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSDigJQgc2VlIHRvRnVsbFJlc1VybC5cbiAgICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGxvYWRhYmxlIFVSTCAoZW1wdHkgdXJsc1tdIG9yIHRoZSBmZXRjaCBmYWlsZWQpOiBzaWduYWwgXCJjb3VsZG4ndFxuICAgIC8vIGxvYWRcIiB3aXRoIGEgbnVsbCBkZXNjcmlwdG9yIOKAlCBzYW1lIGFzIHRoZSB0aWxlZCBwYXRoIHdoZW4gdGhlcmUncyBub1xuICAgIC8vIHNlbGVjdGVkLWZpbGUgaW5mbyDigJQgc28gcGxvdCgpIHJldHVybnMgZmFsc2UgKGl0cyBgaWYgKCFkKWAgZ3VhcmQpIGFuZFxuICAgIC8vIHRoZSByb3V0ZXIgY2FuIGZhbGwgYmFjaywgaW5zdGVhZCBvZiBtb3VudGluZyBhbiA8aW1nPiB3aXRoIGFuIHVuZGVmaW5lZFxuICAgIC8vIHNyYyB0aGF0IHRocm93cyBhdCBydW50aW1lLlxuICAgIGlmICghdXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGhhcyBubyBsb2FkYWJsZSBVUkw7IHNraXBwaW5nIE9TRCByZW5kZXInLCBmaWxlbmFtZSk7XG4gICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgeiwgZmlsZW5hbWUgfTtcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpbGVTaXplOiAwLCAgICAgICAgICAgIC8vIHVudXNlZDogc2ltcGxlIG1vZGUgbmV2ZXIgY2FsbHMgYnVpbGRUaWxlU291cmNlXG4gICAgICB6OiAxLCAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZnJhbWVcbiAgICAgIGNoYW5uZWxzOiBtZXRhPy5yZ2JDaGFubmVscyA/PyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlID8gMSA6IDMpLFxuICAgICAgbXVsdGljaGFubmVsOiBmYWxzZSxcbiAgICAgIHJlYWxMZXZlbHM6IDEsXG4gICAgICBsZXZlbHM6IFt7IHJlczogMCwgd2lkdGgsIGhlaWdodCB9XSxcbiAgICAgIG1wcFg6IG1ldGE/Lm1wcFggPz8gMCxcbiAgICAgIG1wcFk6IG1ldGE/Lm1wcFkgPz8gMCxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgaW5mb0I2NDogJycsXG4gICAgICB6LFxuICAgICAgZmlsZW5hbWUsXG4gICAgICBzaW1wbGU6IHRydWUsXG4gICAgICB1cmwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0QncyBge3R5cGU6J2ltYWdlJ31gIHNvdXJjZSBzaXplcyBpdHMgY29vcmRpbmF0ZSB3b3JsZCB0byB0aGUgaW1hZ2Unc1xuICAgKiBOQVRVUkFMIHBpeGVscy4gQSBmb2xkZXItc3RhY2sgc2xpY2UgaXMgYSBzZXJ2ZXIgYC9wcmV2aWV3YCB3aG9zZSBwaXhlbCBzaXplXG4gICAqIG5lZWRuJ3QgbWF0Y2ggdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSDigJQgaXQgbWF5IGJlIGRvd25zY2FsZWQgKGxhcmdlXG4gICAqIGltYWdlcykgT1IgbGFyZ2VyIHRoYW4gdGhlIGRpbWVuc2lvbnMgYC9tZXRhZGF0YWAgcmVwb3J0cy4gRWl0aGVyIHdheSBPU0Qnc1xuICAgKiB3b3JsZCB3b3VsZCBkaWZmZXIgZnJvbSB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2UgKFF1UGF0aCBnZW9qc29uLFxuICAgKiBpbiBsZXZlbC0wIHBpeGVscyk6IGEgc21hbGxlciBwcmV2aWV3IHJlbmRlcnMgUk9JcyBvdmVyc2l6ZWQsIGEgbGFyZ2VyIG9uZVxuICAgKiByZW5kZXJzIHRoZW0gdW5kZXJzaXplZC9vZmZzZXQuIFJlc2FtcGxlIHRoZSBwcmV2aWV3IHRvIEVYQUNUTFkgdGhlXG4gICAqIGZ1bGwtcmVzb2x1dGlvbiBkaW1lbnNpb25zIChibHVycnkgYnV0IHBvc2l0aW9uYWxseSBleGFjdCDigJQgc2NhbGluZyB1cCBvclxuICAgKiBkb3duIGFzIG5lZWRlZCkgc28gT1NEJ3Mgd29ybGQgbWF0Y2hlcyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWxlIHN0aWxsXG4gICAqIHVzaW5nIE9TRCdzIHJlbGlhYmxlIHNpbmdsZS1pbWFnZSByZW5kZXJlci4gQ2FjaGVkIHBlciBwcmV2aWV3IFVSTCAocmV2b2tlZFxuICAgKiBvbiBmaWxlIGNoYW5nZSk7IGEgbm8tb3Agd2hlbiB0aGUgcHJldmlldyBpcyBhbHJlYWR5IGV4YWN0bHkgZnVsbC1yZXMgKHNtYWxsXG4gICAqIGltYWdlcywgaW4tbWVtb3J5IHBpcGVsaW5lIGJsb2JzKSwgd2hlbiB0aGUgZGltcyBhcmUgdW5rbm93biwgb3Igd2hlblxuICAgKiB0aGV5J3JlIGltcGxhdXNpYmx5IGxhcmdlIChndWFyZHMgYWdhaW5zdCBhbiBlbm9ybW91cyBjYW52YXMpLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0b0Z1bGxSZXNVcmwocHJldmlld1VybDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpID4gdGhpcy5TSU1QTEVfVVBTQ0FMRV9NQVhfRElNKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmdldChwcmV2aWV3VXJsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcHJldmlld1VybDsgLy8gY291bGRuJ3QgZGVjb2RlIOKAlCBsZXQgT1NEIHRyeSB0aGUgVVJMIGFzLWlzXG4gICAgfVxuICAgIC8vIEFscmVhZHkgdGhlIGV4YWN0IGZ1bGwtcmVzIHdvcmxkIOKAlCBubyByZXNhbXBsZSBuZWVkZWQuIChBIHByZXZpZXcgdGhhdCBpc1xuICAgIC8vIGxhcmdlciBPUiBzbWFsbGVyIHRoYW4gZnVsbC1yZXMgbXVzdCBzdGlsbCBiZSByZXNpemVkIHNvIE9TRCdzIHdvcmxkID09XG4gICAgLy8gdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlOyBvbmx5IGFuIGV4YWN0IG1hdGNoIGlzIHNraXBwYWJsZS4pXG4gICAgaWYgKGltZy5uYXR1cmFsV2lkdGggPT09IHdpZHRoICYmIGltZy5uYXR1cmFsSGVpZ2h0ID09PSBoZWlnaHQpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsgLy8gc2NhbGUgcHJldmlldyAodXAgb3IgZG93bikgdG8gZnVsbC1yZXNcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXNvbHZlKSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGZ1bGxSZXNVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuc2V0KHByZXZpZXdVcmwsIGZ1bGxSZXNVcmwpO1xuICAgIHJldHVybiBmdWxsUmVzVXJsO1xuICB9XG5cbiAgLyoqIFNhbXBsZSBhIFNJTVBMRS1tb2RlIHNsaWNlJ3Mgb3duIGRlY29kZWQgcGl4ZWxzIGludG8gdGhlIGhpc3RvZ3JhbSDigJQgdGhlXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgc2FtcGxlcnMgKG5vIHRpbGUgc2VydmVyKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICAgKiAgYSBkZWNvZGUgZmFpbHVyZSBqdXN0IGxlYXZlcyB0aGUgcGFuZSBlbXB0eSByYXRoZXIgdGhhbiB0aHJvd2luZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzYW1wbGVTaW1wbGVIaXN0b2dyYW0odXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwodXJsKTtcbiAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICBpZiAoIXcgfHwgIWgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlSGlzdG9ncmFtKHosIGRhdGEsIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIGhpc3RvZ3JhbSBzYW1wbGUgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggKyBkZWNvZGUgYSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lcyAoc2luZ2xlLWJhbmQgZ3JheXNjYWxlKSBpbnRvXG4gICAqICBwaXhlbCBidWZmZXJzLCBmb3IgdGhlIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGNvbXBvc2l0b3IuIEF1dGgtc2FmZTogZ29lc1xuICAgKiAgdGhyb3VnaCBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGJsb2I6L2RhdGE6IGFzLWlzOyBodHRwIHZpYSBIdHRwQ2xpZW50KS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyh1cmxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXJscyA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwodSk7XG4gICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGlmICghdyB8fCAhaCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgIGlmICghY3R4KSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gY2hhbm5lbCBwbGFuZSBkZWNvZGUgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IHBsYW5lcztcbiAgfVxuXG4gIC8qKiBDb21wb3NpdGUgdGhlIGNhY2hlZCBwZXItY2hhbm5lbCBwbGFuZXMgaW50byBPTkUgUkdCQSBpbWFnZSB1c2luZyB0aGVcbiAgICogIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgKGNvbG91ci93aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSkg4oCUIHRoZSBjbGllbnQtc2lkZSxcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBwZXItY2hhbm5lbCAnbGlnaHRlcicgY29tcG9zaXRvclxuICAgKiAgKHNhbWUgZGlzcGxheS5jaGFubmVsUmdiTHV0IG1hdGggYXMgcmVjb2xvckNoYW5uZWxUaWxlLCBhcHBsaWVkIHBlci1wbGFuZSkuXG4gICAqICBSZXR1cm5zIGEgYmxvYjogVVJMIG9mIHRoZSBjb21wb3NpdGUgUE5HLCByZXZva2luZyB0aGUgcHJldmlvdXMgb25lLiAqL1xuICBwcml2YXRlIGFzeW5jIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcztcbiAgICBpZiAoIXBsYW5lcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdyA9IHBsYW5lc1swXS53aWR0aCwgaCA9IHBsYW5lc1swXS5oZWlnaHQ7XG4gICAgaWYgKCF3IHx8ICFoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IHBsYW5lcy5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbY107XG4gICAgICBpZiAoc3QgJiYgc3QudmlzaWJsZSA9PT0gZmFsc2UpIGNvbnRpbnVlOyAvLyBoaWRkZW4gY2hhbm5lbCBjb250cmlidXRlcyBub3RoaW5nXG4gICAgICBjb25zdCBwbGFuZSA9IHBsYW5lc1tjXTtcbiAgICAgIGlmIChwbGFuZS53aWR0aCAhPT0gdyB8fCBwbGFuZS5oZWlnaHQgIT09IGggfHwgIXBsYW5lLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgciwgZywgYiB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgICAgY29uc3QgcGQgPSBwbGFuZS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKHBkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGx1bSA9IHBkW2ldOyAvLyBzaW5nbGUtYmFuZCBwbGFuZSAoUj1HPUIpXG4gICAgICAgIG91dFtpXSArPSByW2x1bV07ICAgICAgICAgIC8vIFVpbnQ4Q2xhbXBlZEFycmF5IGNsYW1wcyDihpIgYWRkaXRpdmUgKCdsaWdodGVyJylcbiAgICAgICAgb3V0W2kgKyAxXSArPSBnW2x1bV07XG4gICAgICAgIG91dFtpICsgMl0gKz0gYltsdW1dO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkgb3V0W2ldID0gMjU1OyAvLyBvcGFxdWVcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3OyBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEob3V0LCB3LCBoKSwgMCwgMCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzKSA9PiBjYW52YXMudG9CbG9iKHJlcywgJ2ltYWdlL3BuZycpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTtcbiAgICB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsO1xuICB9XG5cbiAgLyoqIFJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWQgcGxhbmVzIChuZXcgY2hhbm5lbCBzdGF0ZXMpXG4gICAqICBhbmQgcmUtb3BlbiDigJQgdGhlIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBpbnZhbGlkYXRlLW9uLWNoYW5uZWwtY2hhbmdlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29tcG9zaXRlQW5kT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgIGlmICghdXJsIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIHRyeSB7IHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpOyB9IGNhdGNoIHsgLyogdmlld2VyIGdvbmUgKi8gfVxuICB9XG5cbiAgLyoqIExvYWQgYSBVUkwgaW50byBhbiBIVE1MSW1hZ2VFbGVtZW50IChyZXNvbHZlcyBvbmNlIGRlY29kZWQpLiBVc2VzXG4gICAqICBkb2N1bWVudC5jcmVhdGVFbGVtZW50IHJhdGhlciB0aGFuIGBuZXcgSW1hZ2UoKWAgYmVjYXVzZSB0aGlzIGZpbGUnc1xuICAgKiAgYEltYWdlYCBpbXBvcnQgaXMgaW1hZ2UtanMncyBkZWNvZGVyLCBub3QgdGhlIERPTSBlbGVtZW50LiAqL1xuICBwcml2YXRlIGxvYWRJbWFnZUVsKHVybDogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKGUpID0+IHJlamVjdChlKTtcbiAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdSBvZiB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnZhbHVlcygpKSBVUkwucmV2b2tlT2JqZWN0VVJMKHUpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7IHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gbnVsbDsgfVxuICB9XG5cbiAgLyoqIE1vdW50IHRoZSB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSBwb2ludGluZyBhdCBgR0VUIC90aWxlYC4gKi9cbiAgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgX3NjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIF9wbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGltYWdlTG9hZGVkIGFzIE9zZExvYWRlZDtcbiAgICBjb25zdCBkID0gbG9hZGVkPy5kZXNjcmlwdG9yO1xuICAgIGlmICghZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgLy8gUmUtZXN0YWJsaXNoIHRoZSBjb2xvcm1hcCBzdWJzY3JpcHRpb24gaWYgYSBwcmlvciBjb21wb25lbnQgdGVhcmRvd25cbiAgICAvLyAodW5zdWJzY3JpYmUoKSkgdG9yZSBpdCBkb3duIOKAlCB0aGlzIHNlcnZpY2UgaXMgYSByb290IHNpbmdsZXRvbiwgc28gdGhlXG4gICAgLy8gY29uc3RydWN0b3Igd29uJ3QgcnVuIGFnYWluIHRvIHJlY3JlYXRlIGl0LlxuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgICAvLyBPU0QgdGlsZXMgbmF0aXZlbHksIHNvIHRoZSBpbi1wbGFjZSAobGFyZ2UpIHBhc3MgaXMgbm9ybWFsbHkgYSBuby1vcFxuICAgIC8vIG9uY2UgbW91bnRlZCDigJQgdGhlIHRpbGUgcHlyYW1pZCBJUyB0aGUgZnVsbCByZXNvbHV0aW9uIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyB3aGljaCBJbWFnZUluZm8gdGllciByZXF1ZXN0ZWQgaXQuIFNpbXBsZSBtb2RlIGhhcyBubyBweXJhbWlkIHRvIGZhbGxcbiAgICAvLyBiYWNrIG9uOiBpdCBkaXNwbGF5cyBsaXRlcmFsbHkgd2hhdGV2ZXIgVVJMIHdhcyBsYXN0IG9wZW5lZCwgc29cbiAgICAvLyB3aXRob3V0IHRoaXMgc3dhcCB0aGUgc21hbGwgdGllcidzIDEyOHB4IHBsYWNlaG9sZGVyIHdvdWxkIHN0YXkgb25cbiAgICAvLyBzY3JlZW4gZm9yZXZlciAocGl4ZWxhdGVkLCBuZXZlciBcInNoYXJwZW5pbmdcIiBsaWtlIHRoZSB0aWxlZCBwYXRoKS5cbiAgICBpZiAoaW5QbGFjZSAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgaWYgKGxvYWRlZC5zaW1wbGUgJiYgbG9hZGVkLnVybCkge1xuICAgICAgICAvLyBBbHNvIHJlZnJlc2ggc2ltcGxlVXJscyB0byBUSElTIHBoYXNlJ3MgKGxhcmdlLXRpZXIpIHVybHNbXSDigJQgaXQgd2FzXG4gICAgICAgIC8vIHNldCBmcm9tIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggdXJscyBvbiB0aGUgaW5pdGlhbCBtb3VudCBiZWxvdyxcbiAgICAgICAgLy8gd2hpY2ggbmV2ZXIgcnVucyBhZ2FpbiBmb3IgdGhlIGluLXBsYWNlIHBhc3MuIFdpdGhvdXQgdGhpcyxcbiAgICAgICAgLy8gc2V0WkluZGV4J3MgbGF0ZXIgc2xpZGVyIHNjcnVicyB3b3VsZCBrZWVwIHJlYWRpbmcgdGhlIHNtYWxsXG4gICAgICAgIC8vIHRpZXIncyBsb3ctcmVzIFVSTHMgZm9yZXZlciwgZXZlbiB0aG91Z2ggdGhlIGluaXRpYWwgc2xpY2Ugd2FzXG4gICAgICAgIC8vIGNvcnJlY3RseSBzd2FwcGVkIHRvIGZ1bGwgcmVzb2x1dGlvbiBoZXJlLlxuICAgICAgICB0aGlzLnNpbXBsZVVybHMgPSBpbWFnZUluZm8/LnVybHMgPz8gdGhpcy5zaW1wbGVVcmxzO1xuICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50RmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRvciA9IGQ7XG4gICAgdGhpcy5pbmZvQjY0ID0gbG9hZGVkLmluZm9CNjQ7XG4gICAgdGhpcy5jdXJyZW50WiA9IGxvYWRlZC56O1xuICAgIHRoaXMuc2ltcGxlTW9kZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICB0aGlzLnNpbXBsZVVybHMgPSBsb2FkZWQuc2ltcGxlID8gKGltYWdlSW5mbz8udXJscyA/PyBbXSkgOiBbXTtcbiAgICAvLyBUaGUgZGVzY3JpcHRvcidzIHBoeXNpY2FsIHBpeGVsIHNpemUgKHNlcnZlciBCaW8tRm9ybWF0cyBgL3RpbGVzL2luZm9gKSBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIHB1c2ggaXQgaW50byB0aGUgc2hhcmVkIG1ldGEgc28gdGhlIFJlZ2lvbiBFZGl0b3IgcmVwb3J0c1xuICAgIC8vIGFyZWFzIGluIMK1bcKyL21twrIsIG1hdGNoaW5nIHRoZSBzY2FsZSBiYXIgYnVpbHQgZnJvbSBgZC5tcHBYYCBiZWxvdy5cbiAgICB0aGlzLnN0b3JlLnNldFBoeXNpY2FsUGl4ZWxTaXplKGQubXBwWCwgZC5tcHBZKTtcbiAgICAvLyBVc2UgdGhlIFNBTUUgZ3JheXNjYWxlIGZsYWcgdGhlIGNvbG9ybWFwIGRyb3Bkb3duIC8gUGxvdGx5IHVzZVxuICAgIC8vIChpbWFnZUluZm8uaXNHcmF5c2NhbGUg4oaQIHJnYkNoYW5uZWxzID09PSAxKS4gVGhlIGRlc2NyaXB0b3IncyBgY2hhbm5lbHNgXG4gICAgLy8gKGNoYW5uZWxDb3VudCkgZGl2ZXJnZXMgZnJvbSByZ2JDaGFubmVscyBmb3Igc3RhY2tzLCB3aGljaCBsZWZ0IGdyYXlzY2FsZVxuICAgIC8vIHN0YWNrcyB1bi1yZWNvbG9yZWQgZXZlbiB0aG91Z2ggdGhlIGNvbG9ybWFwIHNlbGVjdG9yIHdhcyBzaG93bi5cbiAgICB0aGlzLmlzR3JheXNjYWxlSW1hZ2UgPSAhIWltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gU2ltcGxlIChub24tdGlsZWQsIGluLW1lbW9yeSkgaW1hZ2U6IG5vIHB5cmFtaWQsIG5vIHBlci1jaGFubmVsIHRpbGVzLCBhbmRcbiAgICAvLyBubyBzZXJ2ZXItc2lkZSBpbnRlbnNpdHkgc2FtcGxpbmcg4oCUIE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2Rlc1xuICAgIC8vIHVybHNbel0gZGlyZWN0bHkuIFNraXAgdGhlIHdob2xlIHRpbGVkLXNldHVwIHBhdGggYmVsb3cuXG4gICAgY29uc3Qgc2ltcGxlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIGlmIChzaW1wbGUpIHtcbiAgICAgIHRoaXMucmVhbExldmVscyA9IDE7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIGhpc3RvZ3JhbSDigJQgQUZURVIgZGVzdHJveVZpZXdlciAoaXRzIGxhc3QgYWN0IGlzIHNhbXBsZXIuY2xlYXIoKSkuXG4gICAgICAvLyBNdWx0aWNoYW5uZWwgYmlucyBlYWNoIGNhY2hlZCBjaGFubmVsIHBsYW5lOyBzaW5nbGUtYmFuZCAvIFJHQiBiaW5zIHRoZVxuICAgICAgLy8gZGVjb2RlZCBmcmFtZSdzIG93biBwaXhlbHMuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKGxvYWRlZC56LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbShsb2FkZWQudXJsLCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGluZGV4ZWQvTFVULWJlYXJpbmcgc3RhY2tzKSBjb21wb3NpdGUgY2xpZW50LXNpZGVcbiAgICAgIC8vIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMuIFRydXN0IHRoZSBzZXJ2ZXIncyBleHBsaWNpdCBgbXVsdGljaGFubmVsYCBmbGFnIOKAlCB0aGVcbiAgICAgIC8vIG9sZCBgY2hhbm5lbHM+MSAmJiBncmF5c2NhbGVgIGhldXJpc3RpYyBhbHNvIG1hdGNoZWQgUkdCIHBob3RvcyBCaW8tRm9ybWF0c1xuICAgICAgLy8gcmVhZHMgYXMgc2VwYXJhdGVkIHBsYW5lcyAoY2hhbm5lbHM+MSwgcmdiQ2hhbm5lbHM9PTEpLCBzcGxpdHRpbmcgdGhlbSBpbnRvIE5cbiAgICAgIC8vIHBlci1jaGFubmVsIFRpbGVkSW1hZ2VzIHRoYXQgZmxvb2RlZCB0aGUgdGlsZSBlbmRwb2ludCBhbmQgaHVuZyBvbiBsb2FkLlxuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gZC5yZWFsTGV2ZWxzID8/IGQubGV2ZWxzLmxlbmd0aDtcbiAgICAgIC8vIFRpbGVzIHRvIGNvdmVyIHRoZSB3aG9sZSBpbWFnZSBhdCB0aGUgY29hcnNlc3QgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbCAodGhlXG4gICAgICAvLyBzbWFsbGVzdCBsZXZlbCB0aGF0IGhhcyByZWFsLCBwZXItY2hhbm5lbC1mZXRjaGFibGUgdGlsZXMg4oCUIHN5bnRoZXRpYyBvdmVydmlld1xuICAgICAgLy8gbGV2ZWxzIGFyZSBzZXJ2ZXItY29tcG9zaXRlZCBvbmx5KS4gQSBweXJhbWlkYWwgaW1hZ2UncyBjb2Fyc2VzdCByZWFsIGxldmVsIGlzXG4gICAgICAvLyB0aW55IChmZXcgdGlsZXMpOyBhIGZsYXQvbm8tcHlyYW1pZCBpbWFnZSdzIGlzIHRoZSBmdWxsLXJlcyBncmlkIChtYW55IHRpbGVzKS5cbiAgICAgIGNvbnN0IGNvYXJzZSA9IGQubGV2ZWxzW3RoaXMucmVhbExldmVscyAtIDFdID8/IGQubGV2ZWxzW2QubGV2ZWxzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgY29hcnNlVyA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2Uud2lkdGggLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VIID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS5oZWlnaHQgLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VUaWxlcyA9IGNvYXJzZVcgKiBjb2Fyc2VIO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9ICEhZC5tdWx0aWNoYW5uZWw7XG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICAvLyBQZXItY2hhbm5lbCByZW5kZXJpbmcgY2FuIG9ubHkgdXNlIHRoZSBSRUFMIGxldmVscywgc28gT1NEIHJlcXVlc3RzIHRoZVxuICAgICAgICAvLyBjb2Fyc2VzdCByZWFsIGxldmVsJ3Mgd2hvbGUgdGlsZSBncmlkIMOXIE4gY2hhbm5lbHMgYXQgZml0LiBXaGVuIHRoYXQncyBsYXJnZVxuICAgICAgICAvLyAoYSB3aG9sZS1zbGlkZSksIGl0J3MgdG9vIG1hbnkgKG9mdGVuIHNsb3csIHB5cmFtaWQtbGVzcykgZnVsbC1yZXMgcmVhZHMg4oCUXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlIHNlcnZlci1jb21wb3NpdGVkIHNvdXJjZSAod2hpY2gga2VlcHMgdGhlIGZhc3RcbiAgICAgICAgLy8gc3ludGhldGljIG92ZXJ2aWV3cykuIEEgc21hbGwgc2luZ2xlLUZPViB6LXN0YWNrIHN0YXlzIHBlci1jaGFubmVsLiBTaXplIGluXG4gICAgICAgIC8vIEJZVEVTIGlzbid0IHRoZSBzaWduYWwg4oCUIHRpbGUgY291bnQgaXMuXG4gICAgICAgIGNvbnN0IGZpdFRpbGVzID0gY29hcnNlVGlsZXMgKiBNYXRoLm1heCgxLCBkLmNoYW5uZWxzID8/IDEpO1xuICAgICAgICBpZiAoZml0VGlsZXMgPiB0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTKSB7XG4gICAgICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbT1NEXSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIHRvbyBsYXJnZSBmb3IgcGVyLWNoYW5uZWwgcmVuZGVyaW5nOiAnICtcbiAgICAgICAgICAgIGAke2NvYXJzZVd9eCR7Y29hcnNlSH0gdGlsZXMgeCAke2QuY2hhbm5lbHN9IGNoYW5uZWxzID0gJHtmaXRUaWxlc30gYXQgdGhlIGNvYXJzZXN0IGAgK1xuICAgICAgICAgICAgYHJlYWwgbGV2ZWwgKD4gJHt0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTfSk7IHJlbmRlcmluZyBzZXJ2ZXItY29tcG9zaXRlZCBmb3Igc3BlZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgLy8gQXV0by1yYW5nZSBncmF5c2NhbGUgdGlsZXMgdG8gdGhlIGltYWdlJ3MgYWN0dWFsIGludGVuc2l0eSBzcGFuIChsaWtlIHRoZVxuICAgICAgLy8gaGVhdG1hcCksIHNhbXBsaW5nIHRoZSBjb2Fyc2VzdCB0aWxlIGxldmVsIHNvIHRoZSB3aW5kb3cgbWF0Y2hlcyB0aGUgcmF3XG4gICAgICAvLyB0aWxlIHZhbHVlcy4gRmlyZS1hbmQtZm9yZ2V0OiBpdCByZS1pbnZhbGlkYXRlcyBvbmNlIHRoZSB3aW5kb3cgaXMga25vd247XG4gICAgICAvLyB0aWxlcyBwYWludCB1bndpbmRvd2VkIHVudGlsIHRoZW4uIChNdWx0aWNoYW5uZWwgd2luZG93cyBhcmUgcGVyLWNoYW5uZWwsXG4gICAgICAvLyBkZWZhdWx0aW5nIHRvIGZ1bGwgcmFuZ2U7IHRoZSB1c2VyIGF1dG8vZWRpdHMgZWFjaCBjaGFubmVsLilcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTaXplIHRoZSBzbGljZSBjYWNoZSBmb3IgdGhpcyBpbWFnZTogTFJVIGNhcCB0byBob2xkIHRoZSB3aG9sZSBzdGFja1xuICAgICAgLy8gKGNhcHBlZCkgYW5kIHNraXAgYmFja2dyb3VuZCBwcmVsb2FkaW5nIGZvciBzdGFja3MgdG9vIGxhcmdlIHRvIHByZWxvYWRcbiAgICAgIC8vICh3b3VsZCBmbG9vZCBmdWxsLXJlcyByZWFkcykuIE5vcm1hbCBzdGFja3Mga2VlcCB0aGUgZmxpY2tlci1mcmVlIHByZS1jYWNoZS5cbiAgICAgIHRoaXMuY2FjaGUuY29uZmlndXJlKGQueiA/PyAxLCBjb2Fyc2VUaWxlcyk7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIG1vZGU6IE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2RlcyB0aGUgVVJMIChibG9iOi9kYXRhOi9odHRwKVxuICAgIC8vIGRpcmVjdGx5IOKAlCBubyBweXJhbWlkLCBubyBzZXJ2ZXIuIFRpbGVkIG1vZGU6IHRoZSBjdXN0b20gc2VydmVyLWJhY2tlZCB0aWxlXG4gICAgLy8gc291cmNlIChtdWx0aWNoYW5uZWwgb3BlbnMgb24gY2hhbm5lbCAwOyB0aGUgb3BlbiBoYW5kbGVyIHRoZW4gc3dhcHMgaW4gdGhpc1xuICAgIC8vIHNsaWNlJ3MgcGVyLWNoYW5uZWwgZ3JvdXAgYW5kIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBwcmUtZmlsbHMgdGhlIHJlc3QpLlxuICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBzaW1wbGVcbiAgICAgID8geyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfVxuICAgICAgOiB0aGlzLmJ1aWxkVGlsZVNvdXJjZShkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnosIHRoaXMuaXNNdWx0aUNoYW5uZWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICBzaWxlbmNlT3NkTXVsdGlJbWFnZUFkdmlzb3J5KCk7XG4gICAgdGhpcy52aWV3ZXIgPSAoT1NEIGFzIGFueSkoe1xuICAgICAgaWQ6IHBsb3REaXYsXG4gICAgICAvLyBTaW1wbGUtbW9kZSB6LXNjcnViIGNhbGxzIHZpZXdlci5vcGVuKCkgYWdhaW4gcGVyIHNsaWNlIChzZWVcbiAgICAgIC8vIHNldFpJbmRleCkg4oCUIHdpdGhvdXQgdGhpcyBpdCByZXNldHMgdG8gdGhlIGhvbWUgem9vbS9wYW4gb24gZXZlcnlcbiAgICAgIC8vIHNsaWNlIGNoYW5nZS4gVGlsZWQgbW9kZSBuZXZlciByZS1vcGVucyAoaXQgdG9nZ2xlcyBwcmUtYWRkZWRcbiAgICAgIC8vIFRpbGVkSW1hZ2VzJyBvcGFjaXR5IGluc3RlYWQpLCBzbyB0aGlzIGlzIGEgbm8tb3AgdGhlcmUuXG4gICAgICBwcmVzZXJ2ZVZpZXdwb3J0OiB0cnVlLFxuICAgICAgLy8gVXNlIHRoZSAyRCBjYW52YXMgZHJhd2VyLCBub3QgV2ViR0w6IGNyZWF0aW5nL2Rlc3Ryb3lpbmcgYSB2aWV3ZXIgb25cbiAgICAgIC8vIGVhY2ggZW5naW5lIHRvZ2dsZSAvIGltYWdlIGxvYWQgY2h1cm5zIFdlYkdMIGNvbnRleHRzIChicm93c2VycyBjYXBcbiAgICAgIC8vIGhvdyBtYW55IGV4aXN0IGF0IG9uY2UpLCB3aGljaCBzdXJmYWNlcyBhcyBcIldlYkdMIGNvbnRleHQgd2FzIGxvc3RcIlxuICAgICAgLy8gYW5kIGJsYW5rIHRpbGVzLiBUaGUgY2FudmFzIGRyYXdlciBoYXMgbm8gc3VjaCBsaW1pdC5cbiAgICAgIGRyYXdlcjogJ2NhbnZhcycsXG4gICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6IGZhbHNlLCAvLyBhdm9pZHMgbmVlZGluZyB0aGUgaWNvbi1pbWFnZSBhc3NldHNcbiAgICAgIC8vIE92ZXJ2aWV3IHRodW1ibmFpbCB3aXRoIHRoZSBjdXJyZW50LXZpZXdwb3J0IHJlY3RhbmdsZSwgYm90dG9tLXJpZ2h0LlxuICAgICAgc2hvd05hdmlnYXRvcjogdGhpcy5uYXZpZ2F0b3JWaXNpYmxlLFxuICAgICAgLy8gTmVhcmVzdC1uZWlnaGJvdXIgd2hlbiBvZmYg4oaSIGNyaXNwIHBpeGVscyBvbiB6b29tLWluIChwaXhlbCBpbnNwZWN0aW9uKS5cbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogdGhpcy5zbW9vdGhpbmdFbmFibGVkLFxuICAgICAgbmF2aWdhdG9yUG9zaXRpb246ICdCT1RUT01fUklHSFQnLFxuICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAwLjE2LFxuICAgICAgbmF2aWdhdG9yQXV0b0ZhZGU6IGZhbHNlLFxuICAgICAgbmF2aWdhdG9yQmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gICAgICBsb2FkVGlsZXNXaXRoQWpheDogdHJ1ZSxcbiAgICAgIGFqYXhXaXRoQ3JlZGVudGlhbHM6IHRydWUsIC8vIGNvb2tpZSBhdXRoIChvYXV0aDItcHJveHkpXG4gICAgICBhamF4SGVhZGVyczogdGhpcy5hdXRoSGVhZGVycywgLy8gYmVhcmVyIGF1dGggKEF1dGgwKSwgd2hlbiBhdmFpbGFibGVcbiAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiAnQW5vbnltb3VzJyxcbiAgICAgIC8vIEdlbnRsZXIgem9vbTogdGhlIGRlZmF1bHQgKDEuMikgZmVlbHMgZmFzdCBhbmQgYmlnIGp1bXBzIGNyb3NzIHNldmVyYWxcbiAgICAgIC8vIHB5cmFtaWQgbGV2ZWxzIGF0IG9uY2UsIGZpcmluZyBhIGJ1cnN0IG9mIHRpbGUgcmVxdWVzdHMuXG4gICAgICB6b29tUGVyU2Nyb2xsOiAxLjEsXG4gICAgICAvLyBDbGljay10by16b29tIHRvd2FyZCB0aGUgY2xpY2tlZCBwb2ludCAoT3BlblNlYWRyYWdvbidzIGRlZmF1bHQgZGVtb1xuICAgICAgLy8gYmVoYXZpb3VyKS4gT25seSBhcHBsaWVzIHdoZW4gbm8gcmVnaW9uIHRvb2wgaXMgYWN0aXZlIOKAlCBhbiBhY3RpdmUgdG9vbFxuICAgICAgLy8gZGlzYWJsZXMgT1NEIG1vdXNlLW5hdiBzbyBjbGlja3MgZHJhdy9zZWxlY3QgaW5zdGVhZCBvZiB6b29taW5nLlxuICAgICAgZ2VzdHVyZVNldHRpbmdzTW91c2U6IHsgY2xpY2tUb1pvb206IHRydWUsIHNjcm9sbFRvWm9vbTogdHJ1ZSB9LFxuICAgICAgLy8gWm9vbSBsaW1pdHMgKGppdC11aSM5NCkuIERlZmF1bHQgbWluWm9vbUltYWdlUmF0aW8gKDAuOSkgc3RvcHMgeW91IGZyb21cbiAgICAgIC8vIHpvb21pbmcgdGhlIGltYWdlIHNtYWxsZXIgdGhhbiB+aG9tZTsgZHJvcCBpdCBzbyB0aGUgaW1hZ2UgY2FuIGJlIHNocnVua1xuICAgICAgLy8gZnJlZWx5IChlZmZlY3RpdmVseSBubyBtaW5pbXVtKS4gRGVmYXVsdCBtYXhab29tUGl4ZWxSYXRpbyAoMS4xKSBjYXBzXG4gICAgICAvLyB6b29tLWluIGF0IH4xIHNjcmVlbiBweCBwZXIgaW1hZ2UgcHg7IHJhaXNlIGl0IHNvIHlvdSBjYW4gem9vbSBpbiB0b1xuICAgICAgLy8gaW5zcGVjdCBpbmRpdmlkdWFsIHBpeGVscyAocGFpcmVkIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlIGZvclxuICAgICAgLy8gY3Jpc3AgbmVhcmVzdC1uZWlnaGJvdXIgYmxvY2tzKS5cbiAgICAgIG1pblpvb21JbWFnZVJhdGlvOiAwLjAxLFxuICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86IDIwLFxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHZpZXcgdG8gc2V0dGxlIGJlZm9yZSBwdWxsaW5nIG5ldyB0aWxlcyAobGVzcyBjaHVybikuXG4gICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uVGltZTogMC40LFxuICAgICAgLy8gUmVsZWFzZSBtZW1vcnkgYWdncmVzc2l2ZWx5OiBjYXAgdGhlIHRpbGUgY2FjaGUgc28gdGlsZXMgb3V0c2lkZSB0aGVcbiAgICAgIC8vIGN1cnJlbnQgdmlldyAoZS5nLiB0aGUgY29hcnNlciBsZXZlbHMgbGVmdCBiZWhpbmQgYWZ0ZXIgem9vbWluZyBpbikgYXJlXG4gICAgICAvLyBldmljdGVkIGluc3RlYWQgb2YgYWNjdW11bGF0aW5nLiBMYXJnZSB3aG9sZS1zbGlkZSB0aWxlcyDigJQgZG91YmxlZCB3aGVuXG4gICAgICAvLyB0aGUgY29sb3JtYXAgcGlwZWxpbmUga2VlcHMgYSByZWNvbG9yZWQgY29weSDigJQgbWFrZSBhbiB1bmJvdW5kZWQgY2FjaGVcbiAgICAgIC8vIGNvc3RseS4gVHVuYWJsZTsgbG93ZXIgPSBsZXNzIG1lbW9yeSwgbW9yZSByZS1mZXRjaCBvbiBwYW4tYmFjay5cbiAgICAgIC8vIFN0YWNrcyBrZWVwIG1hbnkgc2xpY2VzIHJlc2lkZW50ICh0aGUgd2hvbGUgc3RhY2sgaXMgYmFja2dyb3VuZC1sb2FkZWQpLFxuICAgICAgLy8gc28gdGhleSBnZXQgYSBtdWNoIGxhcmdlciB0aWxlIGJ1ZGdldCDigJQgb3RoZXJ3aXNlIHN3aXRjaGluZyBzbGljZXMgZXZpY3RzXG4gICAgICAvLyBlYWNoIG90aGVyJ3MgdGlsZXMgYW5kIHNjcnViYmluZyBiYWNrIHJlLWZldGNoZXMuIFNjYWxlZCB0byB0aGUgcmVzaWRlbnRcbiAgICAgIC8vIHNsaWNlIGNvdW50OyBzaW5nbGUgaW1hZ2VzIGtlZXAgdGhlIGxlYW4gZGVmYXVsdC5cbiAgICAgIG1heEltYWdlQ2FjaGVDb3VudDogKGQueiA/PyAxKSA+IDEgPyBNYXRoLm1pbigyNDAwLCBNYXRoLm1heCg2MDAsIHRoaXMuY2FjaGUubWF4U2xpY2VzKCkgKiA0MCkpIDogMTUwLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBBbHdheXMgc2V0dGxlOiBpZiBPU0QgbmV2ZXIgZW1pdHMgb3Blbi9vcGVuLWZhaWxlZCAoYSBiYWQgdGlsZSBzb3VyY2UsXG4gICAgICAvLyBhIHZpZXdlciB0b3JuIGRvd24gbWlkLW9wZW4pLCB0aGUgcmVuZGVyIHBpcGVsaW5lIG11c3Qgbm90IGhhbmcg4oCUIGEgaGFuZ1xuICAgICAgLy8gbGVhdmVzIGltYWdlTG9hZGluZz10cnVlLCBzdGlja2luZyB0aGUgc3Bpbm5lciBhbmQgdGhlIDUwMG1zXG4gICAgICAvLyBjYWNoZS1wcm9ncmVzcyBwb2xsIGZvcmV2ZXIgKE5TX0JJTkRJTkdfQUJPUlRFRCBzdG9ybSkuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IChvazogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXNldHRsZWQpIHtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKG9rKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3BlbicsICgpID0+IHtcbiAgICAgICAgLy8gUmVnaW9uIG92ZXJsYXkgcmVhZHMvd3JpdGVzIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUsIHNvIHJlZ2lvbnMgc3RheVxuICAgICAgICAvLyBpbiBzeW5jIHdpdGggUGxvdGx5IGFuZCB0aGUgUmVnaW9uIEVkaXRvci4gUmVjcmVhdGUgaXQgcGVyIG9wZW4oKSBzb1xuICAgICAgICAvLyBpdCBiaW5kcyB0byB0aGUgZnJlc2hseS1vcGVuZWQgdmlld2VyJ3MgY2FudmFzL01vdXNlVHJhY2tlci5cbiAgICAgICAgdGhpcy5vdmVybGF5Py5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBPc2RSZWdpb25PdmVybGF5KHRoaXMudmlld2VyIGFzIGFueSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgICAgIHRoaXMuY29vcmRUcmFuc2Zvcm0gPSBuZXcgT3NkQ29vcmRpbmF0ZVRyYW5zZm9ybSh0aGlzLnZpZXdlciBhcyBhbnkpO1xuICAgICAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE9zZFNjYWxlQmFyKHRoaXMudmlld2VyIGFzIGFueSwgZC5tcHBYID8/IDApO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgICAgIC8vIFNpbXBsZSBtb2RlIGlzIGEgc2luZ2xlLCBzZWxmLWNvbnRhaW5lZCBpbWFnZSDigJQgbm8gc2xpY2UgY2FjaGUgdG8gc2VlZC5cbiAgICAgICAgaWYgKHNpbXBsZSkge1xuICAgICAgICAgIC8qIG5vdGhpbmcgdG8gY2FjaGU6IG9uZSBmcmFtZSwgbm8gcHlyYW1pZCAqL1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICAvLyBEcm9wIHRoZSBzaW5nbGUgb3BlbmVkIChjaGFubmVsLTApIGltYWdlIGFuZCBhZGQgdGhpcyBzbGljZSdzIGNoYW5uZWxcbiAgICAgICAgICAvLyBncm91cCB0byB0aGUgcGVyLXNsaWNlIGNhY2hlLiBUaGUgc2hhcmVkIGJhY2tncm91bmQgbG9hZGVyIC8gTFJVIHRoZW5cbiAgICAgICAgICAvLyBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgY2hhbm5lbCBncm91cHMgc28gei1zY3J1YiBpcyBmbGlja2VyLWZyZWUuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGl0MCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICAgIGlmIChpdDApICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgICAgICB9IGNhdGNoIHsgLyogbm90aGluZyB0byByZW1vdmUgKi8gfVxuICAgICAgICAgIHRoaXMuY2FjaGUuYWRkQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlZWQgdGhlIHNsaWNlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIHNsaWNlICh3b3JsZCBpdGVtIDApLCBzb1xuICAgICAgICAgIC8vIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uXG4gICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuY2FjaGUuc2VlZENvbXBvc2l0ZSh0aGlzLmN1cnJlbnRaLCBmaXJzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlICpyZW5kZXJlZCB2aWV3cG9ydCosIHNvIGl0cyBwaXhlbCBtYXRyaXggaXMgb25seVxuICAgICAgICAvLyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgdmlldyDigJQgZHJvcCBpdCB3aGVuZXZlciB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ3ZpZXdwb3J0LWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdyYXlzY2FsZSB0aWxlcyBnZXQgdGhlIGFjdGl2ZSBjb2xvcm1hcCB2aWEgdGhlIHBpeGVsIHBpcGVsaW5lLiBUaGVcbiAgICAgICAgLy8gaGFuZGxlciBydW5zIHBlciB0aWxlIG9uIGxvYWQgKGFuZCBvbiByZXF1ZXN0SW52YWxpZGF0ZSk7IHJlY29sb3JpbmdcbiAgICAgICAgLy8gaXMgYSBuby1vcCBmb3IgUkdCIGltYWdlcyBvciBiZWZvcmUgdGhlIExVVCByZXNvbHZlcy5cbiAgICAgICAgLy8gKGlzR3JheXNjYWxlSW1hZ2UgaXMgc2V0IGZyb20gaW1hZ2VJbmZvLmlzR3JheXNjYWxlIGluIHBsb3QoKSBhYm92ZS4pXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd0aWxlLWludmFsaWRhdGVkJywgKGV2ZW50OiBhbnkpID0+IHRoaXMucmVjb2xvclRpbGUoZXZlbnQpKTtcbiAgICAgICAgLy8gVGhlIG92ZXJ2aWV3IG5hdmlnYXRvciBpcyBhIHNlcGFyYXRlIG1pbmktdmlld2VyIHdpdGggaXRzIG93biB0aWxlcyxcbiAgICAgICAgLy8gc28gaXQgZG9lc24ndCByZWNlaXZlIHRoZSBtYWluIHZpZXdlcidzIHRpbGUtaW52YWxpZGF0ZWQgZXZlbnRzLiBBcHBseVxuICAgICAgICAvLyB0aGUgc2FtZSByZWNvbG9yIHBpcGVsaW5lIHRvIGl0IHNvIHRoZSBtaW5pbWFwIHRyYWNrcyB0aGUgbWFpbiBpbWFnZSdzXG4gICAgICAgIC8vIGNvbG9ybWFwL0xVVCBpbnN0ZWFkIG9mIHN0YXlpbmcgZ3JheXNjYWxlLlxuICAgICAgICBjb25zdCBuYXYgPSAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I7XG4gICAgICAgIG5hdj8uYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIGlmICgodGhpcy5pc0dyYXlzY2FsZUltYWdlICYmIHRoaXMuY29sb3JMdXQpIHx8IHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmF2Py53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQcmVmZXRjaCBhZGphY2VudCB6LXNsaWNlcyBvbmNlIHRoZSB2aWV3IHNldHRsZXMgKGFuZCBvbiBlYWNoIHNldHRsZSxcbiAgICAgICAgLy8gc28gaXQgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXdwb3J0IGFzIHRoZSB1c2VyIHBhbnMvem9vbXMpLiBTaW1wbGUgbW9kZVxuICAgICAgICAvLyBoYXMgYSBzaW5nbGUgZnJhbWUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBwcmVmZXRjaC5cbiAgICAgICAgaWYgKCFzaW1wbGUpIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCkpO1xuICAgICAgICAvLyBUZWxsIGxpc3RlbmVycyAodGhlIGludGVuc2l0eSBpbnNldCkgdGhlIHZpc2libGUgaW1hZ2UgcmVnaW9uIHdoZW5ldmVyXG4gICAgICAgIC8vIHRoZSB2aWV3IHNldHRsZXMsIHNvIHRoZXkgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tIHJlc29sdXRpb24uXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5lbWl0Vmlld3BvcnRDaGFuZ2UoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIC8vIFRlYXIgZG93biBhbnkgYWN0aXZlIHRvb2wgb3ZlcmxheXMgKHNoYXJlZCBzaW5nbGV0b25zKS5cbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICB0aGlzLm92ZXJsYXkuZGVzdHJveSgpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NhbGVCYXIpIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgdGhpcy52aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy52aWV3ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlLnJlc2V0KCk7XG4gICAgdGhpcy5zYW1wbGVyLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyICh0aGUgU1ZHIG92ZXJsYXkpLCBvbmNlIGEgcGxvdCBpcyBtb3VudGVkLiAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheTtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBpc29zdXJmYWNlLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyAzRCBzY2VuZXMsIHNvIG5vIGNvbnRyb2xzLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBMSU5FIGludGVuc2l0eSBST0lzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHRvT3ZlcmxheU1vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiBSZWdpb25Ub29sTW9kZSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlICdkcmF3cmVjdCc6XG4gICAgICAgIHJldHVybiAnZHJhd3JlY3QnO1xuICAgICAgY2FzZSAnZHJhd2Nsb3NlZHBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdjbG9zZWRwYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdvcGVucGF0aCc6XG4gICAgICAgIHJldHVybiAnZHJhd29wZW5wYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuICdkcmF3cG9seWdvbic7XG4gICAgICBjYXNlICdhZGRwb2ludCc6XG4gICAgICAgIHJldHVybiAnYWRkcG9pbnQnO1xuICAgICAgY2FzZSAnZGVsZXRlcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2RlbGV0ZXBvaW50JztcbiAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuICdzZWxlY3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cblxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIGhvc3QgcmUtZHJpdmVzIHBsb3QoKSB2aWEgdGhlIGltYWdlLWluZm8gc3RyZWFtICovXG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZwID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnApIHJldHVybjtcbiAgICAvLyBLZWVwIHRoZSB1c2VyJ3MgY3VycmVudCB2aWV3IGFjcm9zcyBhIGNvbnRhaW5lci9zcGxpdCByZXNpemUgaW5zdGVhZCBvZlxuICAgIC8vIHNuYXBwaW5nIGhvbWUuIFZpZXdwb3J0IGJvdW5kcyBhcmUgaW1hZ2UtcmVsYXRpdmUgKGltYWdlIHdpZHRoID0gMSksIHNvXG4gICAgLy8gdGhleSdyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29udGFpbmVyJ3MgcGl4ZWwgc2l6ZSDigJQgY2FwdHVyZSB0aGUgdmlzaWJsZVxuICAgIC8vIHJlZ2lvbiBub3cgYW5kIHJlLWZpdCBpdCBvbmNlIHRoZSBuZXcgc2l6ZSBoYXMgc2V0dGxlZC4gT1NEJ3MgYXV0b1Jlc2l6ZVxuICAgIC8vIGZpcmVzIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgYW5ndWxhci1zcGxpdCB0cmFuc2l0aW9uIGFuaW1hdGVzIHRoZSB3aWR0aFxuICAgIC8vIG92ZXIgYSBmZXcgaHVuZHJlZCBtcywgc28gcmVzdG9yZSBvbiB0aGUgbmV4dCBmcmFtZSBhbmQgYWdhaW4gYWZ0ZXIgdGhlXG4gICAgLy8gdHJhbnNpdGlvbiBjb21wbGV0ZXMuXG4gICAgY29uc3QgYm91bmRzID0gdnAuZ2V0Qm91bmRzKHRydWUpO1xuICAgIGNvbnN0IHJlc3RvcmUgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZml0Qm91bmRzKGJvdW5kcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIHZpZXdlciB0b3JuIGRvd24gKi9cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXN0b3JlKTtcbiAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDM1MCk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgfVxuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmdvSG9tZSgpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQoJ2F1dG9zY2FsZScpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC56b29tQnkoMSAvIDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIFJlY3RhbmdsZS9wb2x5Z29uIGRyYXdpbmcgcnVuIG9uIHRoZSBTVkcgb3ZlcmxheTsgd2FuZC9lcmFzZXIvem9vbS1ib3hcbiAgICAvLyAoY3VzdG9tIFBsb3RseSBvdmVybGF5cykgYXJlIHJvdXRlZCB0byBQbG90bHkgYnkgdGhlIHJvdXRlciBhbmQgYXJlbid0XG4gICAgLy8gaGFuZGxlZCBoZXJlIHlldC5cbiAgICB0aGlzLm92ZXJsYXk/LnNldE1vZGUodGhpcy50b092ZXJsYXlNb2RlKG1vZGUpKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogT1NEIG5hdmlnYXRlcyB0aGUgc3RhY2sgdmlhIHRoZSB6LXNsaWRlciAtPiBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvci4gU3RvcmVkIGZvciB0aGUgbmV4dCB2aWV3ZXIgY3JlYXRpb24sIGFuZFxuICAgKiAgYXBwbGllZCBsaXZlIHdoZW4gYSB2aWV3ZXIgaXMgYWxyZWFkeSBtb3VudGVkIChoaWRlcy9yZXZlYWxzIGl0cyBlbGVtZW50IOKAlFxuICAgKiAgdGhlIG5hdmlnYXRvciBpbnN0YW5jZSBpdHNlbGYgb25seSBleGlzdHMgd2hlbiBjcmVhdGVkIHdpdGggc2hvd05hdmlnYXRvcikuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgY29uc3QgbmF2RWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/Lm5hdmlnYXRvcj8uZWxlbWVudDtcbiAgICBpZiAobmF2RWwpIG5hdkVsLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvKiogVG9nZ2xlIGJpbGluZWFyIHNtb290aGluZyB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzKS4gU3RvcmVkIGZvciB0aGVcbiAgICogIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmQgYXBwbGllZCBsaXZlICh3aXRoIGEgcmVkcmF3KSB0byBhIG1vdW50ZWQgdmlld2VyLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc21vb3RoaW5nRW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgY29uc3QgZHJhd2VyOiBhbnkgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyO1xuICAgIGlmIChkcmF3ZXI/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCkge1xuICAgICAgZHJhd2VyLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICAgIHRoaXMudmlld2VyPy5mb3JjZVJlZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHRoZSBkaXNwbGF5ZWQgei1zbGljZSBsaXZlLiBTbGljZXMgYXJlIGtlcHQgYXMgc2VwYXJhdGUgdGlsZWQgaW1hZ2VzIGluXG4gICAqIHRoZSB3b3JsZCwgc28gc3dpdGNoaW5nIGlzIGp1c3QgYW4gb3BhY2l0eSB0b2dnbGU6IGEgcHJldmlvdXNseS12aXNpdGVkIHNsaWNlXG4gICAqIHNob3dzIGluc3RhbnRseSAoaXRzIGRlY29kZWQgKyByZWNvbG9yZWQgdGlsZXMgYXJlIHN0aWxsIHJlc2lkZW50KSwgYW5kIGFcbiAgICogbmV2ZXItc2VlbiBzbGljZSBpcyBhZGRlZCBvbmNlLiBUaGUgcmVnaW9uIG92ZXJsYXksIGNvb3JkaW5hdGUgdHJhbnNmb3JtLFxuICAgKiBzY2FsZSBiYXIsIGNvbG9ybWFwIHBpcGVsaW5lIGFuZCBjdXJyZW50IHpvb20vcGFuIGFsbCBwZXJzaXN0IOKAlCB0aGUgeC95XG4gICAqIGdlb21ldHJ5IGlzIGlkZW50aWNhbCBhY3Jvc3Mgc2xpY2VzLlxuICAgKlxuICAgKiBTaW1wbGUgbW9kZSAodGlsZWQ6ZmFsc2Ug4oCUIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZCBjbGllbnQtc2lkZSxcbiAgICogZWFjaCBzbGljZSBpdHMgb3duIGNvbXBsZXRlIGltYWdlIHdpdGggbm8gc2hhcmVkIHRpbGUgc2VydmVyKSBoYXMgbm9cbiAgICogcHlyYW1pZCB0byB0b2dnbGUgb3BhY2l0eSBvbiwgc28gaXQgcmUtb3BlbnMgdGhlIHZpZXdlciBvbiB0aGUgbmV3XG4gICAqIHNsaWNlJ3MgVVJMIGluc3RlYWQuIHByZXNlcnZlVmlld3BvcnQgKHZpZXdlciBvcHRpb24sIHNlZSBwbG90KCkpIGtlZXBzXG4gICAqIHRoZSBjdXJyZW50IHpvb20vcGFuIGFjcm9zcyB0aGF0IHJlb3Blbi5cbiAgICovXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHogPSB6SW5kZXggfHwgMDtcbiAgICBpZiAoeiA9PT0gdGhpcy5jdXJyZW50WikgcmV0dXJuO1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodGhpcy5zaW1wbGVNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgY29uc3QgdXJscyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbel0gPz8gdGhpcy5zaW1wbGVDaGFubmVsVXJsc1swXTtcbiAgICAgICAgaWYgKCF1cmxzKSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJscyk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKHosIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyk7XG4gICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIgfHwgIXVybCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVVybHNbel0gPz8gdGhpcy5zaW1wbGVVcmxzWzBdO1xuICAgICAgaWYgKCFyYXdVcmwpIHJldHVybjtcbiAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAvLyBGZXRjaGVkIHZpYSBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGF1dGggaW50ZXJjZXB0b3IgYXBwbGllcykgdGhlblxuICAgICAgLy8gdXBzY2FsZWQgdG8gZnVsbC1yZXMgKHNhbWUgYXMgdGhlIGluaXRpYWwgbG9hZCDigJQgc2VlIHRvRnVsbFJlc1VybCkgc29cbiAgICAgIC8vIHRoZSB3b3JsZCBzdGF5cyBmdWxsLXJlcyBhY3Jvc3Mgc2xpY2VzIGFuZCBST0lzIGtlZXAgYWxpZ25pbmcuIEd1YXJkXG4gICAgICAvLyBhZ2FpbnN0IGEgbmV3ZXIgc2NydWIgbGFuZGluZyBmaXJzdC5cbiAgICAgIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKVxuICAgICAgICAudGhlbigocHJldmlld1VybCkgPT5cbiAgICAgICAgICB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IDAsIHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IDApLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIHJlLW9wZW4gZmFpbGVkJywgZT8ubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgICB2b2lkIHRoaXMuc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybCwgeik7IC8vIHJlLWJpbiB0aGUgc2NydWJiZWQgc2xpY2VcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignW09TRF0gc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kZXNjcmlwdG9yIHx8ICF0aGlzLmluZm9CNjQpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gd2FuZCByZWFkYmFjayBpcyBzbGljZS1zcGVjaWZpY1xuICAgIHRoaXMuY2FjaGUuc2hvd1NsaWNlKHopO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXModGhpcy5kZXNjcmlwdG9yLCB0aGlzLmluZm9CNjQsIHopO1xuICAgIH1cbiAgfVxuXG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChzdGFja0xvYWRpbmcpO1xuICB9XG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3IgPyB7IHdpZHRoOiB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGhlaWdodDogdGhpcy5kZXNjcmlwdG9yLmhlaWdodCB9IDogbnVsbDtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBpeGVscyDigJQgdGhlIHJlbmRlcmVkIHZpZXdwb3J0ICh3aGF0IHRoZSB1c2VyIHNlZXMsXG4gICAqIGluY2x1ZGluZyB0aGUgY3VycmVudCB6b29tIGFuZCBhbnkgY29sb3JtYXAgcmVjb2xvciksIGFzIFJHQkEuIEZlZWRzIHRoZVxuICAgKiBwcm9jZXNzaW5nLXBpcGVsaW5lIGRpYWxvZydzIFwidXNlIGN1cnJlbnQgdmlld1wiLiBSZXR1cm5zIG51bGwgdW50aWwgdGlsZXNcbiAgICogYXJlIGRyYXduLlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyPy5jYW52YXM7XG4gICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy53aWR0aCB8fCAhY2FudmFzLmhlaWdodCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzO1xuICAgIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHM6IDQsIGRhdGE6IGltZy5kYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogSW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIHRoZSBkcmF3ZXIgY2FudmFzICh3aGF0IHtAbGluayBnZXREaXNwbGF5ZWRQaXhlbERhdGF9XG4gICAqIHJlYWRzKSBjdXJyZW50bHkgY292ZXJzLiBVbmxpa2Uge0BsaW5rIGVtaXRWaWV3cG9ydENoYW5nZX0sIHRoaXMgaXMgTk9UXG4gICAqIGNsYW1wZWQgdG8gdGhlIGltYWdlIGJvdW5kczogdGhlIGNhbnZhcyBtYXBzIDE6MSB0byB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlLFxuICAgKiBzbyBsZWF2aW5nIGl0IHVuY2xhbXBlZCBrZWVwcyBgY2FudmFzUHggLT4gaW1hZ2VQeGAgYW4gZXhhY3QgYWZmaW5lIG1hcFxuICAgKiAoY2xhbXBpbmcgd291bGQgc2tldyBjb29yZGluYXRlcyBuZWFyIHRoZSBpbWFnZSBlZGdlcykuIFJvdXRlZCB0aHJvdWdoIHdvcmxkXG4gICAqIGl0ZW0gMCAoc2VlIHtAbGluayB2aWV3cG9ydFJlY3RUb0ltYWdlfSkgZm9yIG11bHRpLWxheWVyIGFjY3VyYWN5LlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gdmlld3BvcnRSZWN0VG9JbWFnZSh0aGlzLnZpZXdlciwgdnAuZ2V0Qm91bmRzKHRydWUpKTtcbiAgICAgIHJldHVybiB7IHg6IHIueCwgeTogci55LCB3aWR0aDogci53aWR0aCwgaGVpZ2h0OiByLmhlaWdodCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICAvLyBTbmFwc2hvdCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIE9TRCB2aWV3IGFzIGEgUE5HIChXWVNJV1lHKSDigJQgdGhlIHBhcmFsbGVsXG4gICAgLy8gdG8gUGxvdGx5J3MgZG93bmxvYWRJbWFnZS4gT1NEIHVzZXMgdGhlIDJEIGNhbnZhcyBkcmF3ZXIgYW5kIGJha2VzIHRoZVxuICAgIC8vIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIC8gcGVyLWNoYW5uZWwgY29sb3VycyAvXG4gICAgLy8gaW52ZXJ0KSBpbnRvIHRoZSB0aWxlcyB2aWEgdGhlIHJlY29sb3IgcGlwZWxpbmUsIHNvIHRoZSBkcmF3ZXIgY2FudmFzXG4gICAgLy8gYWxyZWFkeSByZWZsZWN0cyBleGFjdGx5IHdoYXQncyBvbiBzY3JlZW4gYXQgdGhlIGN1cnJlbnQgem9vbS9wYW4uIFRoZVxuICAgIC8vIGZ1bGwtcmVzb2x1dGlvbiBzdGl0Y2hlZCBleHBvcnQgbGl2ZXMgaW4gZXhwb3J0Q29tcG9zaXRlKCkgKENoYW5uZWxzICZcbiAgICAvLyBIaXN0b2dyYW0gZGlhbG9nKS5cbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19LnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKF9wbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICAvKiBPU0Qgb25seSByZW5kZXJzIHRoZSBpbWFnZSB0eXBlICovXG4gIH1cbiAgc2V0U3VyZmFjZURyYWdNb2RlKF9tb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRvc2NhbGVFdmVudCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogVmlzaWJsZSBpbWFnZSByZWdpb24gKGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3XG4gICAqICBzZXR0bGVzLiBUaGUgaW50ZW5zaXR5IGluc2V0IHJlLXNhbXBsZXMgdGhpcyByZWdpb24gYXQgdGhlIHpvb20gcmVzb2x1dGlvbi4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBpbnRlbnNpdHkgc2FtcGxpbmcgbGl2ZXMgaW4gdGhlIFBsb3RseVxuICAgKiAgYmFja2VuZCAoaXQgb3ducyBwaXhlbCByZWFkYmFjaykuIE9TRCBmZWVkcyBpdCBvbmx5IHZpYSBnZXRWaWV3cG9ydENoYW5nZSQ7XG4gICAqICB0aGUgc2FtcGxpbmctY2FjaGUgcHJpbWluZyBpdHNlbGYgaXMgYSBuby1vcCBoZXJlLiAqL1xuICBhc3luYyBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhfaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBfekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIHtAbGluayBJSW50ZW5zaXR5U2FtcGxpbmd9IHN0dWIg4oCUIHNlZSB7QGxpbmsgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmd9LiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF96SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8qIG5vLW9wOiBQbG90bHkgb3ducyBpbnRlbnNpdHkgc2FtcGxpbmcgKHNlZSBJSW50ZW5zaXR5U2FtcGxpbmcpICovXG4gIH1cblxuICAvKiogQ29tcHV0ZSB0aGUgY3VycmVudCB2aWV3cG9ydCdzIGltYWdlLXBpeGVsIHJlY3RhbmdsZSAoY2xhbXBlZCB0byB0aGUgaW1hZ2UpXG4gICAqICBhbmQgYnJvYWRjYXN0IGl0LiAqL1xuICBwcml2YXRlIGVtaXRWaWV3cG9ydENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2cDogYW55ID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnAgfHwgIXRoaXMuZGVzY3JpcHRvcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAob3NkLWNvb3Jkcyk6IHZwLnZpZXdwb3J0VG9JbWFnZVJlY3RhbmdsZSBpc1xuICAgICAgLy8gaW5hY2N1cmF0ZSBhbmQgd2FybnMgd2hlbiB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbFxuICAgICAgLy8gbXVsdGljaGFubmVsIGxheWVycyksIHdoaWNoIGZlZCB0aGUgaW50ZW5zaXR5IGluc2V0IGEgd3JvbmcgUk9JLlxuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICBjb25zdCBpdyA9IHRoaXMuZGVzY3JpcHRvci53aWR0aCwgaWggPSB0aGlzLmRlc2NyaXB0b3IuaGVpZ2h0O1xuICAgICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGl3LCByLngpKTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpaCwgci55KSk7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGl3IC0geCwgci53aWR0aCkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oaWggLSB5LCByLmhlaWdodCkpO1xuICAgICAgdGhpcy52aWV3cG9ydENoYW5nZSQubmV4dCh7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogT1NEIHRhcmdldHMgdGhlIGltYWdlIGRpc3BsYXk7IHRoZSBzY2FsYXIvM0QgcGxvdCB0eXBlcyBiZWxvbmcgdG8gUGxvdGx5LiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICByZXR1cm4gW1BMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5IRUFUTUFQXSFdO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICAvKiogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZTsgdGhlIExJTkUgaW50ZW5zaXR5IGluc2V0IGlzIFBsb3RseS1vbmx5LiAqL1xuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBubyBMSU5FIG1vZGUgb24gT1NEICovXG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gbmFwYXJpLWpzKS4gVGhlIE9TRCByZWdpb25cbiAgLy8gb3ZlcmxheSAoY29uc3RydWN0ZWQgaW4gcGxvdCgpKSByZWFkcy93cml0ZXMgdGhhdCBzYW1lIHN0b3JlLCBzbyByZWdpb25zXG4gIC8vIHN0YXkgaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3I7IE9TRCByZW5kZXJzIHRoZW0gYXMgYW4gU1ZHXG4gIC8vIG92ZXJsYXkgcmF0aGVyIHRoYW4gY2FycnlpbmcgUGxvdGx5IHNoYXBlIGRpY3RzLlxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdhbmQgKyB2ZXJ0ZXggZXJhc2VyIHJ1biBvdmVyIE9TRCB2aWEgSUNvb3JkaW5hdGVUcmFuc2Zvcm0uIFRoZXkgc2hhcmUgdGhlXG4gIC8vIHNpbmdsZXRvbiB0b29sIHNlcnZpY2VzIHdpdGggUGxvdGx5LCBzbyB3ZSByZS1iaW5kIHRvIG91ciBob3N0cyBvbiBhY3RpdmF0ZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgZHJhd3MgaW5zdGVhZCBvZiBwYW5uaW5nLiAoTmF2IGlzXG4gICAgLy8gcmUtZW5hYmxlZCB3aGVuIHRoZSByZWdpb24gb3ZlcmxheSByZXR1cm5zIHRvICdub25lJyBvbiB0b29sIHN3aXRjaC4pXG4gICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7XG4gICAgLy8gVGhlIHdhbmQgc2FtcGxlcyB0aGUgcmVuZGVyZWQgdmlld3BvcnQg4oCUIHJlYWQgYmFjayBsYXppbHkgb24gZmlyc3QgdXNlLlxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKG9wdGlvbnMgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIGNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCk7XG4gIH1cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGFrZSB0aGUgcG9pbnRlciBmcm9tIE9TRCBzbyB0aGUgZHJhZyBwYWludHMgaW5zdGVhZCBvZiBwYW5uaW5nLlxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSBicnVzaCB3b3JrcyBpbiB0aGUgcmVuZGVyZWQtdmlld3BvcnQgY29vcmRpbmF0ZSBmcmFtZSDigJQgcmVhZCBpdCBiYWNrXG4gICAgLy8gbGF6aWx5IG9uIGZpcnN0IHVzZSwgbGlrZSB0aGUgd2FuZC4gSXQgc2hhcmVzIHRoZSB3YW5kJ3MgaG9zdC5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRTaXplKChvcHRpb25zIGFzIEJydXNoT3B0aW9ucyk/LnNpemUgPz8gMCk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdG9vbCB0YWtlcyB0aGUgcG9pbnRlclxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLmVyYXNlclRvb2wuYmluZEhvc3QodGhpcy5lcmFzZXJIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cbiAgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdGhlIGJveCBkcmFnIG11c3Qgbm90IHBhblxuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gICAgaWYgKCFhY3RpdmUpIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQodHJ1ZSk7XG4gIH1cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKHZpZXdwb3J0IHJlYWRiYWNrICsgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyByZWdpb24gc3RvcmUpLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBzZWdtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLnNhbVRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgcmV0dXJuIHRoaXMuc2FtVG9vbC5zZWdtZW50Qm94ZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNlbGxTZWdtZW50ZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIGNyb3AgYWdhaW5zdCB0aGUgY3VycmVudCB2aWV3cG9ydCByZWFkYmFja1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyBjbGlja3MgYWRkIHBvaW50cywgZG9uJ3QgcGFuXG4gICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTsgfVxuXG4gIC8qKiBCdWlsZCB0aGUgd2FuZC9lcmFzZXIgaG9zdCBvYmplY3RzIGJvdW5kIHRvIHRoaXMgYmFja2VuZC4gQm90aCB0b29scyBydW5cbiAgICogIG92ZXIgT1NEIHZpYSB0aGUgc2hhcmVkIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgYSB2aWV3cG9ydCBwaXhlbCByZWFkYmFjayxcbiAgICogIGFuZCByZWFkL3dyaXRlIHJlZ2lvbnMgZGlyZWN0bHkgb24gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSAobmV1dHJhbCBtb2RlbCkuICovXG4gIHByaXZhdGUgYnVpbGRUb29sSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuY3VycmVudEZpbGVOYW1lLFxuICAgICAgZ2V0U2hhcGVDb2xvcjogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgfTtcbiAgICB0aGlzLmVyYXNlckhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBpbnZhbGlkYXRlV2FuZFJlZ2lvbjogKCkgPT4gdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCk/LnJhdGlvc1swXSA/PyAxLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIGVsZW1lbnQgdGhlIG9uLWNhbnZhcyB0b29sIG92ZXJsYXlzIGF0dGFjaCB0byAoT1NEIGlzIG1vdW50ZWQgaGVyZSkuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBTaXplIHRoZSBuYXZpZ2F0b3IgZnJvbSB0aGUgQ1VSUkVOVCBjb250YWluZXIgKG5hdmlnYXRvclNpemVSYXRpbyBvZiB0aGVcbiAgICogIHZpZXdlciBlbGVtZW50KSBhbmQga2VlcCBpdCBwaW5uZWQgdG8gdGhlIGNvcm5lci4gT1NEIGNvbXB1dGVzIHRoZSBzaXplXG4gICAqICBvbmNlIGluIHRoZSBWaWV3ZXIgY29uc3RydWN0b3Ig4oCUIGJlZm9yZSB0aGUgaG9zdCBmbGV4IGxheW91dCBzZXR0bGVzIOKAlFxuICAgKiAgYW5kIG5ldmVyIGNvcnJlY3RzIGl0LCBsZWF2aW5nIGEgc3RhbGUtc2l6ZSBlbGVtZW50IHdob3NlIHZpc2libGUgbWluaW1hcFxuICAgKiAgZmxvYXRzIGFib3ZlIHRoZSBib3R0b20tcmlnaHQgY29ybmVyLiAqL1xuICBwcml2YXRlIHJlc2l6ZU5hdmlnYXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2OiBhbnkgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBuYXYgPSB2Py5uYXZpZ2F0b3I7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdj8uZWxlbWVudDtcbiAgICBpZiAoIW5hdj8uZWxlbWVudCB8fCAhZWw/LmNsaWVudFdpZHRoIHx8ICFlbD8uY2xpZW50SGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3QgdyA9IE1hdGgucm91bmQoZWwuY2xpZW50V2lkdGggKiAwLjE2KTtcbiAgICBjb25zdCBoID0gTWF0aC5yb3VuZChlbC5jbGllbnRIZWlnaHQgKiAwLjE2KTtcbiAgICBpZiAobmF2LmVsZW1lbnQuc3R5bGUud2lkdGggIT09IGAke3d9cHhgIHx8IG5hdi5lbGVtZW50LnN0eWxlLmhlaWdodCAhPT0gYCR7aH1weGApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5hdi5zZXRXaWR0aCh3KTtcbiAgICAgICAgbmF2LnNldEhlaWdodChoKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBuYXZpZ2F0b3IgdG9ybiBkb3duICovIH1cbiAgICB9XG4gICAgLy8gTm9ybWFsaXplIE9TRCdzIGNvbnRyb2wtY29ybmVyIHN0YWNrIHNvIHRoZSBtaW5pbWFwIHNpdHMgZmx1c2ggaW4gdGhlXG4gICAgLy8gY29ybmVyLCBpbnNldCAxMnB4IHRvIGxpbmUgdXAgd2l0aCB0aGUgc2NhbGUgYmFyOlxuICAgIC8vICAtIHRoZSBpbmxpbmUtYmxvY2sgd3JhcHBlciBjYXJyaWVzIGxpbmUtYm94IHN0cnV0cyBhbmQgY2FuIHJldGFpbiBzdGFsZVxuICAgIC8vICAgIHNpemluZyDihpIgbWFrZSBpdCBhIHRpZ2h0IGJsb2NrO1xuICAgIC8vICAtIGFueXRoaW5nIGVsc2UgT1NEIGxlZnQgaW4gdGhlIGNvcm5lciB3b3VsZCBzdGFjayBiZWxvdyB0aGUgbmF2aWdhdG9yXG4gICAgLy8gICAgYW5kIGZsb2F0IGl0IHVwIOKGkiBoaWRlIGl0O1xuICAgIC8vICAtIGluc2V0IHRoZSBjb3JuZXIgaXRzZWxmIChib3R0b20vcmlnaHQgMTJweCksIGtlZXBpbmcgdGhlIGVsZW1lbnQgaW5cbiAgICAvLyAgICBub3JtYWwgZmxvdy5cbiAgICBjb25zdCB3cmFwcGVyID0gbmF2LmVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgY29ybmVyID0gd3JhcHBlcj8ucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHdyYXBwZXIgJiYgY29ybmVyKSB7XG4gICAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgd3JhcHBlci5zdHlsZS5saW5lSGVpZ2h0ID0gJzAnO1xuICAgICAgd3JhcHBlci5zdHlsZS5mb250U2l6ZSA9ICcwJztcbiAgICAgIC8vIFRoZSB3cmFwcGVyIGtlZXBzIHRoZSBuYXZpZ2F0b3IncyBzdGFsZSBwcmUtc2V0dGxlIGhlaWdodCBhcyBhblxuICAgICAgLy8gZXhwbGljaXQgc2l6ZSAodGhlIG5hdiB3YXMgMC4xNnggdGhlIFVOU0VUVExFRCBjb250YWluZXIgYXQgY3JlYXRpb24pLFxuICAgICAgLy8gbGVhdmluZyBhbiBlbXB0eSBiYW5kIHVuZGVyIHRoZSByZXNpemVkIG1pbmltYXAg4oCUIG1lYXN1cmVkIGxpdmU6XG4gICAgICAvLyBuYXZIPTg3IGluc2lkZSB3cmFwSD0xNjcuIEZvcmNlIGl0IHRvIGh1ZyBpdHMgY29udGVudC5cbiAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgd3JhcHBlci5zdHlsZS53aWR0aCA9ICdhdXRvJztcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbShjb3JuZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSB3cmFwcGVyKSBjaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKHdyYXBwZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBuYXYuZWxlbWVudCkgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNvcm5lci5zdHlsZS5ib3R0b20gPSAnMTJweCc7XG4gICAgICBjb3JuZXIuc3R5bGUucmlnaHQgPSAnMTJweCc7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24obmF2LmVsZW1lbnQuc3R5bGUsIHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHRvcDogJycsIGxlZnQ6ICcnLCBib3R0b206ICcnLCByaWdodDogJycsIG1hcmdpbjogJzAnIH0pO1xuICAgIC8vIFRPRE8oZGVidWcpOiByZW1vdmUgYWZ0ZXIgdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgbmVyID0gbmF2LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3IgPSB3cmFwcGVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjciA9IGNvcm5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcGVyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc29sZS53YXJuKGBbdml6Om5hdl0gbmF2Qm90dG9tPSR7TWF0aC5yb3VuZChuZXIuYm90dG9tKX0gd3JhcEJvdHRvbT0ke01hdGgucm91bmQod3I/LmJvdHRvbSA/PyAtMSl9IGAgK1xuICAgICAgYGNvcm5lckJvdHRvbT0ke01hdGgucm91bmQoY3I/LmJvdHRvbSA/PyAtMSl9IHBsb3RCb3R0b209JHtNYXRoLnJvdW5kKHBlci5ib3R0b20pfSBgICtcbiAgICAgIGBuYXZIPSR7TWF0aC5yb3VuZChuZXIuaGVpZ2h0KX0gd3JhcEg9JHtNYXRoLnJvdW5kKHdyPy5oZWlnaHQgPz8gLTEpfSBjb3JuZXJIPSR7TWF0aC5yb3VuZChjcj8uaGVpZ2h0ID8/IC0xKX1gKTtcbiAgfVxuXG4gIC8qKiBGb3JjZSB0aGUgZG9ja2VkIHRvb2xiYXIgdG8gcmVwYWludCBhZnRlciBhbiBPU0Qgem9vbS4gQ2hyb21lIGxlYXZlcyBpdFxuICAgKiAgbGFpZC1vdXQtYnV0LXVucGFpbnRlZCAodGhlIGNhbnZhcydzIGNvbXBvc2l0aW5nIGNodXJuIHN0cmFuZHMgdGhlIHRvb2xiYXInc1xuICAgKiAgcmFzdGVyKS4gQSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIGl0IHdpdGggbm8gdmlzaWJsZSBnb25lLWZyYW1lXG4gICAqICBhbmQgbm8gbGF5b3V0IHNoaWZ0LiBMb2NhdGVkIHZpYSB0aGUgRE9NIHNpbmNlIHRoaXMgc2VydmljZSBkb2Vzbid0IG93biB0aGVcbiAgICogIHRvb2xiYXI7IGEgbm8tb3Agd2hlbiB0aGVyZSdzIG5vIHRvb2xiYXIgKGUuZy4gZW1iZWRkZWQgd2l0aG91dCBvbmUpLiAqL1xuICBwcml2YXRlIG51ZGdlVG9vbGJhclJlcGFpbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGxvdEVsID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gICAgY29uc3QgZG9jayA9IHBsb3RFbD8uY2xvc2VzdCgndmlzdWFsaXphdGlvbicpPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnRvb2xiYXItZG9jaycpO1xuICAgIGlmICghZG9jaykgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBkb2NrLnN0eWxlLmRpc3BsYXk7XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHZvaWQgZG9jay5vZmZzZXRIZWlnaHQ7IC8vIHJlZmxvdyBzbyB0aGUgdG9nZ2xlIHJlLXJhc3RlcnMgb24gdGhlIG5leHQgcGFpbnRcbiAgICBkb2NrLnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICB9XG5cbiAgLyoqIEhvc3QgZm9yIHRoZSAoc2hhcmVkKSB6b29tLXRvLWJveCB0b29sOiBjb252ZXJ0IG92ZXJsYXkgcGl4ZWxzIHRvIGltYWdlXG4gICAqICBjb29yZHMgdmlhIHRoZSB2aWV3cG9ydCwgYW5kIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGNob3NlbiByZWN0YW5nbGUuICovXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXYsXG4gICAgICBwaXhlbFRvRGF0YTogKHB4OiBudW1iZXIsIHB5OiBudW1iZXIpID0+IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBweCwgcHkpLFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHM6IG51bWJlcltdKSA9PiB0aGlzLmFwcGx5Wm9vbVRvQm94KGNvb3JkcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBGaXQgdGhlIE9TRCB2aWV3cG9ydCB0byBhbiBpbWFnZS1zcGFjZSByZWN0YW5nbGUgKGNvb3JkcyBvcmRlcmVkXG4gICAqICBbeE1pbiwgeE1heCwgeU1heCwgeU1pbl0pLiAqL1xuICBwcml2YXRlIGFwcGx5Wm9vbVRvQm94KGNvb3JkaW5hdGVzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFthLCBiLCBjLCBkXSA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihhLCBiKTtcbiAgICBjb25zdCB3ID0gTWF0aC5hYnMoYiAtIGEpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihjLCBkKTtcbiAgICBjb25zdCBoID0gTWF0aC5hYnMoYyAtIGQpO1xuICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IGltYWdlUmVjdFRvVmlld3BvcnQodGhpcy52aWV3ZXIsIHgsIHksIHcsIGgpO1xuICAgIHRoaXMudmlld2VyLnZpZXdwb3J0LmZpdEJvdW5kcyhyZWN0LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIHRoZSAqY3VycmVudGx5IHJlbmRlcmVkKiBPU0QgY2FudmFzIGFzIHRoZSB3YW5kJ3MgcGl4ZWwgbWF0cml4LlxuICAgKiBUaGUgbWF0cml4IGNvdmVycyBvbmx5IHRoZSB2aXNpYmxlIHZpZXdwb3J0IGF0IHNjcmVlbiByZXNvbHV0aW9uLCBzbyB3aGVuXG4gICAqIHRoZSB1c2VyIGlzIHpvb21lZCBpbnRvIGEgc3ViLXJlZ2lvbiB0aGUgd2FuZCBzYW1wbGVzIHRoYXQgcmVnaW9uJ3MgZGV0YWlsXG4gICAqIChyYXRoZXIgdGhhbiB0aGUgd2hvbGUgaW1hZ2UgYXQgcHJldmlldyByZXNvbHV0aW9uKS4gYG9yaWdpblgvb3JpZ2luWWAgYW5kXG4gICAqIGByYXRpb3NgIG1hcCBpbWFnZSBjb29yZHMgPC0+IHJlYWRiYWNrLXBpeGVsIGNvb3JkcyBmb3IgdGhlIHdhbmQnc1xuICAgKiBkYXRhL3JhdGlvL29yaWdpbiBtb2RlbC4gQ2FjaGVkIHVudGlsIHRoZSB2aWV3cG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkYmFja1ZpZXdwb3J0KCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGlmICh0aGlzLnZpZXdwb3J0UGl4ZWxzKSByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlciBhcyBhbnk7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9IHZpZXdlcj8uZHJhd2VyPy5jYW52YXM7XG4gICAgY29uc3QgdnAgPSB2aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQgfHwgIXZwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoOyAvLyBkZXZpY2UgcGl4ZWxzXG4gICAgY29uc3QgaCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTsgLy8gUkdCQSwgcm93LW1ham9yXG4gICAgLy8gQnVpbGQgdGhlIFt5XVt4XSA9IFtyLGcsYl0gbWF0cml4IHRoZSB3YW5kIGV4cGVjdHMgZm9yIFJHQiBmcmFtZXMuXG4gICAgY29uc3QgbWF0cml4OiBudW1iZXJbXVtdW10gPSBuZXcgQXJyYXkoaCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoOyB5KyspIHtcbiAgICAgIGNvbnN0IHJvdzogbnVtYmVyW11bXSA9IG5ldyBBcnJheSh3KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB5ICogdyAqIDQ7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHc7IHgrKykge1xuICAgICAgICBjb25zdCBvID0gYmFzZSArIHggKiA0O1xuICAgICAgICByb3dbeF0gPSBbZGF0YVtvXSwgZGF0YVtvICsgMV0sIGRhdGFbbyArIDJdXTtcbiAgICAgIH1cbiAgICAgIG1hdHJpeFt5XSA9IHJvdztcbiAgICB9XG5cbiAgICAvLyBJbWFnZS1jb29yZCBzcGFuIHRoZSByZWFkYmFjayBjb3ZlcnMgKENTUyBweCBpbiwgaW1hZ2UgY29vcmRzIG91dCkuIFJvdXRlXG4gICAgLy8gdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpIHNvIGl0IHN0YXlzIGFjY3VyYXRlIOKAlCBhbmQgcXVpZXQg4oCUIHdoZW5cbiAgICAvLyB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbCBtdWx0aWNoYW5uZWwgbGF5ZXJzKS5cbiAgICBjb25zdCBlbFcgPSBjYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCBlbEggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgY29uc3QgdGwgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgMCwgMCk7XG4gICAgY29uc3QgYnIgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgZWxXLCBlbEgpO1xuICAgIGNvbnN0IHJhdGlvWCA9IChici54IC0gdGwueCkgLyB3OyAvLyBpbWFnZSBweCBwZXIgcmVhZGJhY2sgcHhcbiAgICBjb25zdCByYXRpb1kgPSAoYnIueSAtIHRsLnkpIC8gaDtcblxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyYXRpb1gsIHJhdGlvWV0sXG4gICAgICBpc0dyYXlzY2FsZTogZmFsc2UsIC8vIGNhbnZhcyByZWFkYmFjayBpcyBhbHdheXMgUkdCQVxuICAgICAgb3JpZ2luWDogdGwueCxcbiAgICAgIG9yaWdpblk6IHRsLnksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbG9yIGEgZ3JheXNjYWxlIHRpbGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIExVVCwgdXNpbmcgT1NEJ3NcbiAgICogdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAoT1NEIDUrLzYpLiBNYXBzIGVhY2ggcGl4ZWwncyBncmF5c2NhbGVcbiAgICogdmFsdWUgKHI9PWc9PWIpIHRvIHRoZSBMVVQncyBSR0IuIE5vLW9wIGZvciBSR0IgaW1hZ2VzIG9yIHVudGlsIHRoZSBMVVQgaXNcbiAgICogYnVpbHQuIEhhbmRsZXIgaXMgYXN5bmMg4oCUIE9TRCBhd2FpdHMgaXQgKHJhaXNlRXZlbnRBd2FpdGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JUaWxlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGlzcGxheVRva2VuO1xuICAgIGNvbnN0IGdyYXkgPSB0aGlzLmlzR3JheXNjYWxlSW1hZ2U7XG4gICAgaWYgKGdyYXkpIHtcbiAgICAgIGlmICghdGhpcy5jb2xvckx1dCkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzcGxheS5yZ2JOZWVkc1JlY29sb3IoKSkge1xuICAgICAgcmV0dXJuOyAvLyBSR0IgYXQgZGVmYXVsdCAoYWxsIHZpc2libGUsIGZ1bGwgd2luZG93LCDOsz0xLCBubyBpbnZlcnQpIOKGkiBwYXNzdGhyb3VnaFxuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHRpbGUncyBwaXhlbHMuIFByZWZlciB0aGUgcmVuZGVyaW5nIGNvbnRleHQsIGJ1dCBzb21lIHRpbGUgY2FjaGVzXG4gICAgLy8gKGFqYXggUE5HIGJsb2JzKSBjb252ZXJ0IHRvIGFuICplbXB0eSogY29udGV4dDJkIOKAlCByZWNvbG9yaW5nIHRoYXQgd291bGRcbiAgICAvLyBibGFuayB0aGUgdGlsZSAod2hpdGUgY2FudmFzKS4gU28gaWYgdGhlIGNvbnRleHQgaGFzIG5vIG9wYXF1ZSBwaXhlbHMsIGRyYXdcbiAgICAvLyB0aGUgdGlsZSdzIG93biBiaXRtYXAvaW1hZ2UgYW5kIHJlY29sb3IgdGhhdCBpbnN0ZWFkLiBXZSBuZXZlciB3cml0ZSBiYWNrXG4gICAgLy8gdW5sZXNzIHdlIGFjdHVhbGx5IHJlY29sb3JlZCBzb21ldGhpbmcsIHNvIGEgdGlsZSBpcyBuZXZlciBibGFua2VkLlxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHRyeSBiaXRtYXAgYmVsb3cgKi9cbiAgICB9XG4gICAgbGV0IGltZzogSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN0eCAmJiBjdHguY2FudmFzICYmIGN0eC5jYW52YXMud2lkdGggJiYgY3R4LmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGltZyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdGlsZSdzIGRlY29kZWQgaW1hZ2UvYml0bWFwLlxuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm9uZSAqL1xuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIG5vbmUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuOyAvLyBjYW4ndCBnZXQgcGl4ZWxzIOKAlCBsZWF2ZSB0aGUgdGlsZSB1bnRvdWNoZWRcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSBzcmMud2lkdGg7XG4gICAgICBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1nLmRhdGEpIHx8ICFjdHgpIHJldHVybjsgLy8gbm90aGluZyBvcGFxdWVcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgaGFzIGFscmVhZHkgcmVzdG9yZWQgdGhpcyB0aWxlIOKAlCB3cml0aW5nIG5vdyB3b3VsZFxuICAgIC8vIGhhbmQgT1NEIGEgc3VwZXJzZWRlZCBjYW52YXMgYW5kIGRlc3Ryb3kgdGhlIGNhY2hlIHJlY29yZC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFRoZSB0aWxlJ3MgY2FjaGUgY2FuIHN0aWxsIGJlIGV2aWN0ZWQgYmV0d2VlbiB0aGUgYXdhaXRzIGFib3ZlIGFuZCBoZXJlIChhXG4gICAgLy8gc2xpY2UgY2hhbmdlKSwgbWFraW5nIHNldERhdGEgdGhyb3cgYSBET01FeGNlcHRpb24gb24gYSBkZWFkIGNhbnZhcy5cbiAgICAvLyBTd2FsbG93IGl0IOKAlCB0aGUgdGlsZSBpcyBnb25lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcmVjb2xvci5cbiAgICB0cnkgeyBhd2FpdCBldmVudC5zZXREYXRhKGN0eCwgJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogdGlsZSBldmljdGVkICovIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaW50IGEgc2luZ2xlIGNoYW5uZWwncyB0aWxlIGluIHBsYWNlLiBFYWNoIGNoYW5uZWwgaXMgaXRzIG93biBPcGVuU2VhZHJhZ29uXG4gICAqIFRpbGVkSW1hZ2UgKGEgc2luZ2xlLWJhbmQgZ3JheXNjYWxlIHRpbGUpOyBPU0QgY29tcG9zaXRlcyB0aGUgTiBpbWFnZXNcbiAgICogYWRkaXRpdmVseSAoJ2xpZ2h0ZXInKSBpbiBpdHMgZHJhd2VyIOKAlCBzbyB0aGlzIGp1c3QgbWFwcyB0aGUgdGlsZSdzIGludGVuc2l0eVxuICAgKiB0aHJvdWdoIHRoZSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hIGFuZCBpdHMgcHNldWRvLWNvbG91ci4gU3luY2hyb25vdXMgKG5vXG4gICAqIGNyb3NzLXRpbGUgZmV0Y2gpIOKGkiBubyByYWNlLCBubyBzZWFtcy4gQ2hhbm5lbCBpcyBwYXJzZWQgZnJvbSB0aGUgdGlsZSBVUkwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JDaGFubmVsVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCB0aWxlID0gZXZlbnQ/LnRpbGU7XG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSAodGlsZSAmJiAodHlwZW9mIHRpbGUuZ2V0VXJsID09PSAnZnVuY3Rpb24nID8gdGlsZS5nZXRVcmwoKSA6IHRpbGUudXJsKSkgfHwgJyc7XG4gICAgY29uc3QgbSA9IC9bPyZdY2hhbm5lbD0oXFxkKykvLmV4ZWModXJsKTtcbiAgICBjb25zdCBjaCA9IG0gPyBwYXJzZUludChtWzFdLCAxMCkgOiAwO1xuICAgIGNvbnN0IHN0ID0gdGhpcy5jaGFubmVsU3RhdGVzW2NoXTtcblxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7IGN0eCA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogZmFsbGJhY2sgYmVsb3cgKi8gfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkgeyBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsgfSBjYXRjaCB7IGltZyA9IG51bGw7IH1cbiAgICB9XG4gICAgaWYgKCFpbWcgfHwgIXRoaXMuaGFzT3BhcXVlKGltZy5kYXRhKSkge1xuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHsgdHJ5IHsgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2UnKTsgfSBjYXRjaCB7IC8qIG5vbmUgKi8gfSB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoOyBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuICAgIGlmICghY3R4KSByZXR1cm47XG5cbiAgICAvLyBQcmVjb21wdXRlIGx1bSgwLi4yNTUpIOKGkiB0aW50ZWQgUkdCIG9uY2UsIHRoZW4gbWFwIGVhY2ggcGl4ZWwgYnkgbG9va3VwIOKAlFxuICAgIC8vIHRoZSBjaGFubmVsIHRpbGUgaXMgc2luZ2xlLWJhbmQsIHNvIHRoaXMgdHVybnMgfjI2MmsgcGVyLXBpeGVsXG4gICAgLy8gY2hhbm5lbEludGVuc2l0eSgpICh3aXRoIE1hdGgucG93IGZvciBnYW1tYSkgY2FsbHMgaW50byAyNTYg4oCUIHRoZSBkaWZmZXJlbmNlXG4gICAgLy8gYmV0d2VlbiBhIHNuYXBweSBhbmQgYSBzbHVnZ2lzaCBzbGlkZXIgb24gYSA0LWNoYW5uZWwgc3RhY2suXG4gICAgY29uc3QgeyByOiByTCwgZzogZ0wsIGI6IGJMIH0gPSB0aGlzLmRpc3BsYXkuY2hhbm5lbFJnYkx1dChzdCk7XG4gICAgY29uc3QgZCA9IGltZy5kYXRhO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgciA9IGRbaV0sIGcgPSBkW2kgKyAxXSwgYiA9IGRbaSArIDJdO1xuICAgICAgY29uc3QgbHVtID0gciA+PSBnID8gKHIgPj0gYiA/IHIgOiBiKSA6IGcgPj0gYiA/IGcgOiBiOyAvLyBzaW5nbGUtYmFuZCDihpIgbWF4XG4gICAgICBkW2ldID0gckxbbHVtXTtcbiAgICAgIGRbaSArIDFdID0gZ0xbbHVtXTtcbiAgICAgIGRbaSArIDJdID0gYkxbbHVtXTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgKHRoZSBuZXh0IHRpY2sgb2YgYSBzbGlkZXIgZHJhZykgaGFzIGFscmVhZHkgcmVzdG9yZWRcbiAgICAvLyB0aGlzIHRpbGUuIFdyaXRpbmcgYSBzdXBlcnNlZGVkIGNvbnRleHQgYmFjayBtYWtlcyBPU0QncyBjb252ZXJzaW9uIHRocm93XG4gICAgLy8gRE9NRXhjZXB0aW9uLCB3aGljaCBkZXN0cm95cyB0aGUgY2FjaGUgcmVjb3JkIGFuZCB1bmxvYWRzIHRoZSB0aWxlIOKAlCBkb1xuICAgIC8vIG5vdGhpbmcgYW5kIGxldCB0aGUgbmV3ZXIgcm91bmQgcmVwYWludCBpdC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFNlZSByZWNvbG9yVGlsZTogdGhlIHRpbGUgY2FjaGUgY2FuIHN0aWxsIGRpZSBiZXR3ZWVuIHRoZSBhd2FpdHMgYW5kIGhlcmUuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKiogUGVyLWNoYW5uZWwgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSwgZnJvbSB0aGUgY3VycmVudFxuICAgKiAgc2xpY2UncyBzYW1wbGVkIHRpbGVzIChncmF5c2NhbGUg4oaSIGNoYW5uZWwgMDsgUkdCIOKGkiBSL0cvQikuIE51bGwgdW50aWwgdGhlXG4gICAqICBhc3luYyBzYW1wbGluZyByZXNvbHZlcyBvciBpZiBpdCB3YXMgc2tpcHBlZC4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBfYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZXIuZ2V0KHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCk7XG4gIH1cblxuICAvKiogTmF0aXZlIGJpdCBkZXB0aCBvZiBhIGNoYW5uZWwgZnJvbSB0aGUgdGlsZSBkZXNjcmlwdG9yICg4IHdoZW4gdW5rbm93bikuICovXG4gIHByaXZhdGUgY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZS4gRm9yID44LWJpdCBpbWFnZXMgaXRcbiAgICogZmV0Y2hlcyB0aGUgKipuYXRpdmUqKiBkaXN0cmlidXRpb24gZnJvbSB0aGUgc2VydmVyIGAvaGlzdG9ncmFtYCBlbmRwb2ludFxuICAgKiAodGhlIDgtYml0IGNhbnZhcyB0aWxlcyBjYW4ndCBjYXJyeSAxNi1iaXQgdmFsdWVzKSBhbmQgY2FjaGVzIGl0IHBlclxuICAgKiBzbGljZStjaGFubmVsOyBmb3IgOC1iaXQvUkdCIGl0IHJldHVybnMgdGhlIGV4aXN0aW5nIGNsaWVudC1zYW1wbGVkIDgtYml0XG4gICAqIGhpc3RvZ3JhbS4gUmVhZC1vbmx5IOKAlCBpdCBuZXZlciB0b3VjaGVzIHRoZSB0aWxlL2Rpc3BsYXkgcGlwZWxpbmUuXG4gICAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleCkgPD0gOCB8fCAhdGhpcy5pbmZvQjY0KSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNhbXBsZXIubmF0aXZlJCh0aGlzLmluZm9CNjQsIHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGltYWdlIGRhdGEgYXMgYSBkYXRhLXByZXNlcnZpbmcgbXVsdGktYmFuZCBUSUZGIGF0XG4gICAqIG5hdGl2ZSBiaXQgZGVwdGggdmlhIGBHRVQgL2V4cG9ydC90aWZmYCAodGhlIHNlcnZlciByZWFkcyB0aGUgcmF3IDE2LWJpdFxuICAgKiBwbGFuZXMg4oCUIHRoZSBjbGllbnQgbmV2ZXIgc2VlcyB0aGVtKS4gU2VuZHMgb25seSB0aGUgdmlzaWJsZSBjaGFubmVsczsgdGhlXG4gICAqIGV4aXN0aW5nIDgtYml0IGNvbXBvc2l0ZSBQTkcgZXhwb3J0IGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBhc3luYyBleHBvcnREYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY2hhbm5lbFN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoO1xuICAgIC8vIE9taXQgYGNoYW5uZWxzYCB3aGVuIGV2ZXJ5IGNoYW5uZWwgaXMgdmlzaWJsZSAoc2VydmVyIGRlZmF1bHQgPSBhbGwpLlxuICAgIGNvbnN0IGNoUGFyYW0gPVxuICAgICAgdmlzaWJsZS5sZW5ndGggJiYgdmlzaWJsZS5sZW5ndGggPCBhbGwgPyBgJmNoYW5uZWxzPSR7dmlzaWJsZS5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWV4cG9ydC90aWZmP2luZm89JHt0aGlzLmluZm9CNjR9Jno9JHt0aGlzLmN1cnJlbnRafSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQodXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pXG4gICAgICAgICAgLnBpcGUodGltZW91dCg2MDAwMDApKSwgLy8gbGFyZ2UgZXhwb3J0cyBzdHJlYW0gc2xvd2x5OyBnZW5lcm91cyBkZWFkbGluZVxuICAgICAgKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IGV4cG9ydDogZmlsZSBzdGlsbCBjYWNoaW5nIOKAlCB0cnkgYWdhaW4gc2hvcnRseS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYmxvYiA9IHJlc3AuYm9keTtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSBjdXJyZW50IHNsaWNlIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGNvbXBvc2l0ZWQgd2l0aCB0aGVcbiAgICogYWN0aXZlIGRpc3BsYXkgc2V0dGluZ3MgKHdpbmRvdyAvIGdhbW1hIC8gY29sb3JtYXAgb3IgcGVyLWNoYW5uZWwgcHNldWRvLVxuICAgKiBjb2xvdXJzIC8gaW52ZXJ0KS4gUGlja3MgdGhlIGxhcmdlc3QgcHlyYW1pZCBsZXZlbCB1bmRlciBhIHBpeGVsIGNhcCAodGhlXG4gICAqIGNvYXJzZXIgb3ZlcnZpZXcgZm9yIGh1Z2Ugd2hvbGUtc2xpZGVzKSwgZmV0Y2hlcyB0aGF0IGxldmVsJ3MgdGlsZSBncmlkLFxuICAgKiBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMsIHJ1bnMgdGhlIHNoYXJlZCBkaXNwbGF5IHBpcGVsaW5lLCBhbmQgc2F2ZXMgaXQuXG4gICAqL1xuICBhc3luYyBleHBvcnRDb21wb3NpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IHRoaXMuZGVzY3JpcHRvcjtcbiAgICBjb25zdCBsZXZlbHMgPSBkZXNjPy5sZXZlbHMgPz8gW107XG4gICAgaWYgKCFkZXNjIHx8ICF0aGlzLmluZm9CNjQgfHwgIWxldmVscy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBDQVAgPSAzMl8wMDBfMDAwOyAvLyB+MzIgTVAg4oCUIGJvdW5kcyBtZW1vcnkgZm9yIHdob2xlLXNsaWRlIGltYWdlc1xuICAgIGxldCByZXMgPSBsZXZlbHMubGVuZ3RoIC0gMTsgLy8gY29hcnNlc3QgZmFsbGJhY2tcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxldmVsc1tpXS53aWR0aCAqIGxldmVsc1tpXS5oZWlnaHQgPD0gQ0FQKSB7IHJlcyA9IGk7IGJyZWFrOyB9XG4gICAgfVxuICAgIGNvbnN0IGx3ID0gbGV2ZWxzW3Jlc10ud2lkdGg7XG4gICAgY29uc3QgbGggPSBsZXZlbHNbcmVzXS5oZWlnaHQ7XG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemU7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsdyAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxoIC8gdCkpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGx3O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBsaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIGNvbnN0IHogPSB0aGlzLmN1cnJlbnRaO1xuICAgIGNvbnN0IGpvYnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykge1xuICAgICAgICBjb25zdCB1cmwgPSBidWlsZFRpbGVVcmwodGhpcy5hcGksIHRoaXMuaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgam9icy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGVCaXRtYXAodGhpcy5odHRwLCB1cmwsIDMwMDAwKTtcbiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYSBmYWlsZWQgdGlsZSDigJQgdGhlIGV4cG9ydGVkIGNvbXBvc2l0ZSBoYXMgYSBnYXAgdGhlcmUuXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSB0aWxlIGZldGNoIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoam9icyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgbHcsIGxoKTtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1hZ2VEYXRhLmRhdGEpKSBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBLZWVwIHRoZSB1bi1yZWNvbG9yZWQgY29tcG9zaXRlIGlmIHJlYWRiYWNrIGZhaWxzIOKAlCBidXQgc2F5IHdoeS5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSByZWNvbG9yIHJlYWRiYWNrIGZhaWxlZCDigJQgZXhwb3J0aW5nIHJhdyB0aWxlcycsIGVycik7XG4gICAgfVxuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fY29tcG9zaXRlLnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBwaXhlbCBpbiB0aGUgUkdCQSBidWZmZXIgaXMgbm9uLXRyYW5zcGFyZW50LiAqL1xuICBwcml2YXRlIGhhc09wYXF1ZShkOiBVaW50OENsYW1wZWRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaV0gIT09IDApIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDilIDilIAgSURpc3BsYXlPcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlLCBzbyBPU0QgYW5kIFBsb3RseSBzdGF5IGluIGxvY2stc3RlcC4gT1NEIGFwcGxpZXMgdGhlXG4gIC8vIGNvbG9ybWFwIHRvIGdyYXlzY2FsZSB0aWxlcyB2aWEgdGhlIExVVCByZWFjdGl2ZWx5IChzZWUgdGhlIGNvbnN0cnVjdG9yJ3NcbiAgLy8gY29sb3JtYXAgc3Vic2NyaXB0aW9uKSwgbm90IGluIHNldENvbG9ybWFwLlxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcm1hcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbG9ybWFwU3ViID0gbnVsbDtcbiAgICAvLyBEcm9wIGEgcXVldWVkIGludmFsaWRhdGlvbiBzbyBpdCBjYW4ndCBmaXJlIGFnYWluc3QgYSB0b3JuLWRvd24gdmlld2VyLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaW52YWxpZGF0ZUhhbmRsZSk7XG4gICAgICBlbHNlIGNsZWFyVGltZW91dCh0aGlzLmludmFsaWRhdGVIYW5kbGUgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pik7XG4gICAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgfVxufVxuIl19
2022
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVB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OzBCQTZJN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQU12QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQU1qQyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0ICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5cblxuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlQWNjZXNzUG9ydCwgVElMRV9BQ0NFU1NfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IFZpekNvbmZpZywgVklaX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFBpeGVsRGF0YSwgSW50ZW5zaXR5UHJvZmlsZSwgSUlzb3N1cmZhY2VDb250cm9scywgSUludGVuc2l0eUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9vc2QtcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgT3NkU2NhbGVCYXIgfSBmcm9tICcuL29zZC1zY2FsZS1iYXInO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXksIFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuL29zZC1jb29yZGluYXRlLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VSZWN0VG9WaWV3cG9ydCwgdmlld3BvcnRSZWN0VG9JbWFnZSB9IGZyb20gJy4vb3NkLWNvb3Jkcyc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZUJpdG1hcCB9IGZyb20gJy4vdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgU2xpY2VDYWNoZSB9IGZyb20gJy4vc2xpY2UtY2FjaGUnO1xuaW1wb3J0IHsgRGlzcGxheVBpcGVsaW5lIH0gZnJvbSAnLi9kaXNwbGF5LXBpcGVsaW5lJztcbmltcG9ydCB7IEhpc3RvZ3JhbVNhbXBsZXIgfSBmcm9tICcuL2hpc3RvZ3JhbS1zYW1wbGVyJztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UsIFpvb21Ub0JveFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci96b29tLXRvLWJveC96b29tLXRvLWJveC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IGJ1aWxkQ29sb3JtYXBMdXQsIFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5cbi8qKlxuICogUXVpZXQgT3BlblNlYWRyYWdvbidzIFwiW1ZpZXdwb3J0LipdIGlzIG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlXCIgYWR2aXNvcmllcy5cbiAqIEEgbXVsdGljaGFubmVsIGltYWdlIGlzIGNvbXBvc2l0ZWQgZnJvbSBvbmUgVGlsZWRJbWFnZSBwZXIgY2hhbm5lbCDigJQgYSBsZWdpdGltYXRlXG4gKiBtdWx0aS1pbWFnZSB3b3JsZCDigJQgYW5kIE9TRCBsb2dzIHRoYXQgYWR2aXNvcnkgKGF0IGVycm9yIGxldmVsKSBmcm9tIGl0cyBvd25cbiAqIG5hdmlnYXRvci9vdmVydmlldyByZW5kZXJpbmcgb24gZXZlcnkgYW5pbWF0aW9uIGZyYW1lLCBmbG9vZGluZyB0aGUgY29uc29sZS4gT3VyXG4gKiBvd24gaW1hZ2U8LT52aWV3cG9ydCBjb252ZXJzaW9ucyBhbHJlYWR5IHJvdXRlIHRocm91Z2ggd29ybGQgaXRlbSAwIChzZWVcbiAqIG9zZC1jb29yZHMpLCBzbyB0aGUgcmVtYWluaW5nIGFkdmlzb3JpZXMgYXJlIE9TRC1pbnRlcm5hbCBhbmQgb25seSBhZmZlY3QgdGhlXG4gKiBtaW5pbWFwJ3MgYm94IGFjY3VyYWN5IChjb3NtZXRpYykuIFRoaXMgd3JhcHMgT1NEJ3MgbG9nZ2VyIGluIGEgUHJveHkgdGhhdCBkcm9wc1xuICogb25seSB0aGF0IG9uZSBtZXNzYWdlIHN0cmluZyBhbmQgZm9yd2FyZHMgZXZlcnkgb3RoZXIgbG9nIHVudG91Y2hlZC4gSWRlbXBvdGVudC5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpOiB2b2lkIHtcbiAgY29uc3Qgb3NkOiBhbnkgPSBPU0QgYXMgYW55O1xuICBpZiAob3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCkgcmV0dXJuO1xuICBjb25zdCBiYXNlOiBhbnkgPSAob3NkLmNvbnNvbGUgJiYgdHlwZW9mIG9zZC5jb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKVxuICAgID8gb3NkLmNvbnNvbGVcbiAgICA6ICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zb2xlIDogbnVsbCk7XG4gIGlmICghYmFzZSkgcmV0dXJuO1xuICBjb25zdCBpc0Fkdmlzb3J5ID0gKGE6IHVua25vd24pID0+XG4gICAgdHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEuaW5kZXhPZignbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UnKSAhPT0gLTE7XG4gIG9zZC5jb25zb2xlID0gbmV3IFByb3h5KGJhc2UsIHtcbiAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZykge1xuICAgICAgY29uc3Qgb3JpZyA9IHRhcmdldFtwcm9wXTtcbiAgICAgIGlmICgocHJvcCA9PT0gJ2Vycm9yJyB8fCBwcm9wID09PSAnd2FybicpICYmIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHsgaWYgKGlzQWR2aXNvcnkoYXJnc1swXSkpIHJldHVybjsgb3JpZy5hcHBseSh0YXJnZXQsIGFyZ3MpOyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nID8gb3JpZy5iaW5kKHRhcmdldCkgOiBvcmlnO1xuICAgIH0sXG4gIH0pO1xuICBvc2QuX19tdWx0aUltYWdlRmlsdGVySW5zdGFsbGVkID0gdHJ1ZTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AuICovXG5pbnRlcmZhY2UgVGlsZUxldmVsIHsgcmVzOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgLyoqIFRydWUgb25seSBmb3IgZ2VudWluZSBtdWx0aS1jaGFubmVsIGNvbXBvc2l0ZXMgKGluZGV4ZWQvTFVULWJlYXJpbmdcbiAgICogIGZsdW9yZXNjZW5jZSBzdGFja3MpIHRoZSBjbGllbnQgc2hvdWxkIHNwbGl0IGludG8gcGVyLWNoYW5uZWwgbGF5ZXJzLiBUaGVcbiAgICogIHNlcnZlciBzZXRzIGl0OyBhbiBSR0IgcGhvdG8gcmVhZCBhcyBzZXBhcmF0ZWQgcGxhbmVzIGhhcyBjaGFubmVscz4xIGJ1dFxuICAgKiAgbXVsdGljaGFubmVsPWZhbHNlLCBzbyBpdCBzdGF5cyBhIHNpbmdsZSBjb21wb3NpdGUgdGlsZSBzb3VyY2UuICovXG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgdGhlIHJlbWFpbmluZ1xuICAgKiAgbGV2ZWxzIGFyZSBzeW50aGV0aWMgY29tcG9zaXRlZCBvdmVydmlld3MgKG5vIHBlci1jaGFubmVsIHRpbGVzKS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgLyoqIFBlci1jaGFubmVsIG1ldGFkYXRhIChuYW1lL2NvbG9yL2JpdERlcHRoL21pbi1tYXhBbGxvd2VkKSBmb3IgbmF0aXZlIDE2LWJpdFxuICAgKiAgd2luZG93aW5nICsgaGlzdG9ncmFtOyBudWxsIGZvciBwbGFpbiA4LWJpdC9SR0Igc291cmNlcy4gKi9cbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmc7IGJpdERlcHRoPzogbnVtYmVyOyBtaW5BbGxvd2VkPzogbnVtYmVyOyBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBgbG9hZCgpYCBoYW5kcyB0byBgcGxvdCgpYC4gKi9cbmludGVyZmFjZSBPc2RMb2FkZWQge1xuICBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGw7XG4gIGluZm9CNjQ6IHN0cmluZztcbiAgejogbnVtYmVyO1xuICAvKiogTWlycm9ycyB0aGUgbG9hZGVkIGltYWdlJ3MgZmlsZW5hbWUg4oCUIHRoZSBkaWFncmFtJ3MgcmVuZGVyIHBpcGVsaW5lXG4gICAqICBndWFyZHMgb24gYGxvYWRlZC5maWxlbmFtZSA9PT0gcGhhc2VJbmZvLmZpbGVOYW1lYCBiZWZvcmUgY2FsbGluZyBwbG90KCkuICovXG4gIGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBTaW1wbGUgKG5vbi10aWxlZCkgaW1hZ2U6IGBwbG90KClgIG9wZW5zIHtAbGluayB1cmx9IGRpcmVjdGx5IHZpYSBPU0Qnc1xuICAgKiAgc2luZ2xlLWltYWdlIHNvdXJjZSDigJQgbm8gdGlsZSBweXJhbWlkLCBubyBzZXJ2ZXIuIFNldCB3aGVuIHRoZSBpbWFnZVxuICAgKiAgY2FycmllcyBgdGlsZWQgPT09IGZhbHNlYCAoc2VlIHtAbGluayBJSW1hZ2VJbmZvLnRpbGVkfSkuICovXG4gIHNpbXBsZT86IGJvb2xlYW47XG4gIC8qKiBUaGUgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2UgVVJMIChgYmxvYjpgL2BkYXRhOmAvYGh0dHBgKSBmb3Igc2ltcGxlIG1vZGUuICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuU2VhZHJhZ29uIHZpc3VhbGl6YXRpb24gYmFja2VuZC5cbiAqXG4gKiBSZW5kZXJzIHRoZSAqaW1hZ2UqIHBsb3QgdHlwZSBhcyBhIG5hdGl2ZWx5LXRpbGVkLCB6b29tYWJsZSByYXN0ZXIsIGJhY2tlZCBieVxuICogdGhlIGppdC1zZXJ2aWNlIHRpbGUgZW5kcG9pbnRzIChgR0VUIC90aWxlcy9pbmZvYCArIGBHRVQgL3RpbGVgLCB3aGljaCByZXVzZVxuICogdGhlIEJpby1Gb3JtYXRzIFJPSSByZW5kZXJlcikuIFBsb3RseSBrZWVwcyB0aGUgc2NpZW50aWZpYy9kYXRhIHBsb3QgdHlwZXNcbiAqIChzY2FsYXIgaGVhdG1hcCwgc3VyZmFjZSwgY29udG91ciwgc2NhdHRlciwgbGluZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSDigJRcbiAqIGhlbmNlIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIG9ubHkgYEltYWdlRGlzcGxheWAuXG4gKlxuICogV2lyZWQ6IGxvYWQg4oaSIGRlc2NyaXB0b3IsIHBsb3Qg4oaSIG1vdW50IHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlLFxuICogem9vbS9wYW4g4oaSIHZpZXdwb3J0IEFQSS4gTk9UIHdpcmVkIHlldCAoZm9sbG93LXVwcyk6IHJlZ2lvbiBvdmVybGF5cyArIHRvb2xzXG4gKiAoYSBwb3NpdGlvbmVkIGNhbnZhcy9TVkcgb3ZlcmxheSBvciBBbm5vdG9yaW91cyksIHBpeGVsIHJlYWRiYWNrLCBhbmQgdGhlXG4gKiBwZXItdGlsZSBMVVQvY29udHJhc3QgcGFyYW1zLiBOb3QgcmVnaXN0ZXJlZCBpbiBESSBwcm92aWRlcnMg4oCUIGBQbG90bHlTZXJ2aWNlYFxuICogaXMgc3RpbGwgdGhlIG9ubHkgYWN0aXZlIGJhY2tlbmQ7IHRoaXMgcHJvdmVzIHRoZSBjb250cmFjdCBzdXBwb3J0cyBhIHNlY29uZFxuICogaW1wbGVtZW50YXRpb24gYWdhaW5zdCByZWFsIGVuZHBvaW50cy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICAvKiogT1NEJ3Mgc3RyZW5ndGggaXMgZGlzcGxheWluZyBhIGxhcmdlIHpvb21hYmxlIGltYWdlIOKAlCBub3RoaW5nIGVsc2UgaGVyZS4gKi9cbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXldKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdlcjogT3BlblNlYWRyYWdvbi5WaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBJUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBPc2RTY2FsZUJhciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCYXNlNjQgUmF3RmlsZUluZm8gKyBjdXJyZW50IHotc2xpY2UsIGtlcHQgc28gc2V0WkluZGV4IGNhbiByZWJ1aWxkIHRoZVxuICAgKiAgdGlsZSBzb3VyY2UgYW5kIHN3YXAgc2xpY2VzIGxpdmUgKHN0YWNrIG5hdmlnYXRpb24pLiAqL1xuICBwcml2YXRlIGluZm9CNjQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50WiA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBjdXJyZW50IGltYWdlIGlzIFwic2ltcGxlXCIgKHRpbGVkOmZhbHNlIOKAlCBzZWxmLWNvbnRhaW5lZFxuICAgKiAgcGVyLXNsaWNlIFVSTHMsIG5vIHRpbGUgc2VydmVyOyBlLmcuIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZFxuICAgKiAgY2xpZW50LXNpZGUgaW50byBhIHN0YWNrKS4gc2V0WkluZGV4IHN3YXBzIHRoZSBzaW5nbGUtaW1hZ2Ugc291cmNlIGZvclxuICAgKiAgdGhlIG5ldyBzbGljZSdzIFVSTCBpbnN0ZWFkIG9mIHVwZGF0aW5nIGEgdGlsZWQgei1wYXJhbS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVNb2RlID0gZmFsc2U7XG4gIC8qKiB1cmxzW10gZm9yIHRoZSBjdXJyZW50IHNpbXBsZS1tb2RlIGltYWdlLCBzbyBzZXRaSW5kZXggY2FuIGxvb2sgdXAgdGhlXG4gICAqICBzbGljZSBiZWluZyBzY3J1YmJlZCB0byAodmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UudXJsRm9yfSkuXG4gICAqICBVbnVzZWQgKGFuZCBsZWZ0IHN0YWxlLCBoYXJtbGVzc2x5KSBpbiB0aWxlZCBtb2RlLiAqL1xuICBwcml2YXRlIHNpbXBsZVVybHM6IHN0cmluZ1tdID0gW107XG4gIC8qKiBwcmV2aWV3IGJsb2IgVVJMIOKGkiBmdWxsLXJlcyB1cHNjYWxlZCBibG9iIFVSTCAoc2VlIHRvRnVsbFJlc1VybCksIHNvXG4gICAqICByZS12aXNpdGluZyBhIHNpbXBsZS1tb2RlIHNsaWNlIGRvZXNuJ3QgcmUtdXBzY2FsZS4gUmV2b2tlZCBvbiBmaWxlIGNoYW5nZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaW1wbGVGdWxsUmVzVXJscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsQ291bnQ+MSk6IHRoZSBzdGFjaydzXG4gICAqICBwZXItc2xpY2UgcGVyLWNoYW5uZWwgcGxhbmUgVVJMcywgdGhlIGN1cnJlbnQgc2xpY2UncyBkZWNvZGVkIHBsYW5lcywgYW5kXG4gICAqICB0aGUgbGFzdCBjb21wb3NpdGUgYmxvYiBVUkwuIENvbXBvc2l0ZWQgY2xpZW50LXNpZGUgdmlhIGRpc3BsYXkuY2hhbm5lbFJnYkx1dFxuICAgKiAgKG5vIHRpbGUgc2VydmVyKTsga2VwdCBPRkYgdGhlIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGguICovXG4gIHByaXZhdGUgc2ltcGxlTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFVybHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDaGFubmVsUGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICBwcml2YXRlIHNpbXBsZUNvbXBvc2l0ZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTa2lwIHRoZSBmdWxsLXJlcyB1cHNjYWxlIGFib3ZlIHRoaXMgbG9uZ2VzdC1zaWRlIGRpbWVuc2lvbiDigJQgYSBmb2xkZXJcbiAgICogIHN0YWNrIGlzIHBlci1maWxlIHByZXZpZXdzICh3ZWxsIHVuZGVyIHRoaXMpOyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYW5cbiAgICogIGFjY2lkZW50YWwgZW5vcm1vdXMgY2FudmFzIGFsbG9jYXRpb24uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgU0lNUExFX1VQU0NBTEVfTUFYX0RJTSA9IDgxOTI7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLy8gUmVnaW9uIHN0YXRlIChyZWdpb25zLCBzZWxlY3Rpb24sIHRoZSB1cGRhdGUgZXZlbnQpIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IHRoZSBJUmVnaW9uU3RvcmUgbWV0aG9kcyBiZWxvdyBkZWxlZ2F0ZSB0byBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLy8gSW1hZ2UgbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIGNvbG9ybWFwL3JldmVyc2Ugc28gT1NEIHJlY29sb3JzIGluXG4gICAqIGxvY2stc3RlcCB3aXRoIFBsb3RseS4gSWRlbXBvdGVudCBhbmQgc2VsZi1oZWFsaW5nOiB0aGlzIHNlcnZpY2UgaXMgYSByb290XG4gICAqIHNpbmdsZXRvbiwgYnV0IGB1bnN1YnNjcmliZSgpYCAoY2FsbGVkIG9uIFZpc3VhbGl6ZXJDb21wb25lbnQgZGVzdHJveSlcbiAgICogdGVhcnMgdGhlIHN1YnNjcmlwdGlvbiBkb3duIOKAlCBhbmQgdGhlIGNvbnN0cnVjdG9yIG5ldmVyIHJ1bnMgYWdhaW4uIFNvXG4gICAqIGBwbG90KClgIGNhbGxzIHRoaXMgdG8gcmUtZXN0YWJsaXNoIGl0IGFmdGVyIGEgY29tcG9uZW50IHRlYXJkb3duL3JlY3JlYXRlXG4gICAqIChlLmcuIHN3aXRjaGluZyBpbWFnZXMpLCBvdGhlcndpc2UgY29sb3JtYXAgY2hhbmdlcyB3b3VsZCBiZSBzaWxlbnRseVxuICAgKiBkcm9wcGVkIG9uIGV2ZXJ5IGltYWdlIGFmdGVyIHRoZSBmaXJzdCBzd2l0Y2guXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbG9ybWFwU3ViKSByZXR1cm47XG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCB0aGUgc2luZ2xlIHNvdXJjZVxuICAgIC8vIG9mIHRydXRoIGZvciBib3RoIGJhY2tlbmRzLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBlaXRoZXIgY2hhbmdlcywgc28gT1NEIHJlY29sb3JzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlICsgcGVyLWNoYW5uZWwgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkgKyBpbnZlcnQgYWxsIGxpdmUgaW5cbiAgICAvLyB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgYW55IG9mIHRoZW0gY2hhbmdlcywgc28gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgdXBkYXRlcyB0aGVcbiAgICAvLyBpbWFnZSBsaXZlIGFuZCBPU0Qgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY20sIHJldiwgY2hhbm5lbHMsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY29sb3JMdXQgPSBidWlsZENvbG9ybWFwTHV0KGNtPy5kYXRhPy52YWx1ZSwgISFyZXYpO1xuICAgICAgdGhpcy5jaGFubmVsU3RhdGVzID0gY2hhbm5lbHM7XG4gICAgICB0aGlzLmludmVydEJnID0gISFpbnZlcnQ7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbDogcmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZFxuICAgICAgLy8gcGxhbmVzIHdpdGggdGhlIG5ldyBjaGFubmVsIHN0YXRlcyArIHJlLW9wZW4gKG5vIHRpbGUtaW52YWxpZGF0ZSBwYXRoKS5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkgeyB2b2lkIHRoaXMucmVjb21wb3NpdGVBbmRPcGVuKCk7IHJldHVybjsgfVxuICAgICAgLy8gTXVsdGljaGFubmVsOiBlYWNoIGNoYW5uZWwgaXMgaXRzIG93biBUaWxlZEltYWdlIOKAlCB2aXNpYmlsaXR5IGlzIHRoZVxuICAgICAgLy8gaW1hZ2UncyBvcGFjaXR5ICh3aW5kb3cvZ2FtbWEvY29sb3VyIGFyZSBhcHBsaWVkIGJ5IHJlY29sb3JDaGFubmVsVGlsZVxuICAgICAgLy8gb24gdGhlIGludmFsaWRhdGUgYmVsb3cpLiBSZS1hcHBseWluZyB0aGUgY3VycmVudCBzbGljZSdzIHJldmVhbCBwaWNrcyB1cFxuICAgICAgLy8gdGhlIG5ldyBwZXItY2hhbm5lbCB2aXNpYmlsaXR5IChjYWNoZWQgc2xpY2VzIHN0YXkgaGlkZGVuKS5cbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuY2FjaGUucmV2ZWFsQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgfVxuICAgICAgLy8gcmVxdWVzdEludmFsaWRhdGUodHJ1ZSkgcmVzdG9yZXMgZWFjaCB0aWxlIHRvIGl0cyBvcmlnaW5hbCBkYXRhIGJlZm9yZVxuICAgICAgLy8gcmUtcnVubmluZyByZWNvbG9yVGlsZSwgc28gYSBjaGFuZ2UgYWx3YXlzIG1hcHMgYWZyZXNoIChubyBjb21wb3VuZGluZykuXG4gICAgICAvLyBSR0Igbm93IHJlY29sb3JzIHRvbyAocGVyLWNoYW5uZWwgd2luZG93L3Zpc2liaWxpdHkpLCBzbyBkb24ndCBnYXRlIG9uXG4gICAgICAvLyBncmF5c2NhbGUuIENvYWxlc2NlZDogUHJpbWVORydzIHNsaWRlciBmaXJlcyAob25DaGFuZ2UpIGNvbnRpbnVvdXNseSwgc29cbiAgICAgIC8vIGEgc2luZ2xlIGRyYWcgd291bGQgb3RoZXJ3aXNlIHF1ZXVlIGRvemVucyBvZiBvdmVybGFwcGluZyByZXN0b3JlICtcbiAgICAgIC8vIHJlLXByb2Nlc3Mgcm91bmRzIG92ZXIgZXZlcnkgY2hhbm5lbCBpbWFnZS5cbiAgICAgIHRoaXMuc2NoZWR1bGVJbnZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VlZCB0aGUgSW50ZW5zaXR5IGNoYW5uZWwgd2l0aCBhIG1lYXN1cmVkIGF1dG8td2luZG93IHdoaWxlIGl0J3Mgc3RpbGxcbiAgICogIGF0IGZ1bGwgcmFuZ2UgKG5ldmVyIGNsb2JiZXIgdGhlIHVzZXIncyBtYW51YWwgd2luZG93KTsgaWYgdGhlIHVzZXJcbiAgICogIGFscmVhZHkgd2luZG93ZWQsIGp1c3QgcmUtaW52YWxpZGF0ZSBzbyBwYWludGVkIHRpbGVzIHBpY2sgdGhlIExVVCB1cC4gKi9cbiAgcHJpdmF0ZSBzZWVkR3JheVdpbmRvdyhtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjaDAgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgaWYgKGNoMCAmJiBjaDAubWluID09PSAwICYmIGNoMC5tYXggPT09IDI1NSkge1xuICAgICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoMCwgeyBtaW4sIG1heCB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY29sb3JMdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I/LndvcmxkPy5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGF0YVJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgdGlsZS1zb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIHNlbGVjdGVkIGZpbGUuIFRoZSBgaW5mb2AgcGFyYW0gaXNcbiAgICogdGhlIGJhc2U2NCBSYXdGaWxlSW5mbyB0aGUgcmVzdCBvZiB0aGUgQVBJIHVzZXM7IHRoZSBHRVQgZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBhdXRoIGludGVyY2VwdG9yIChCZWFyZXIpLiBXZSBhbHNvIGdyYWIgYSB0b2tlbiBoZXJlIGZvciBPU0QncyBvd24gdGlsZVxuICAgKiBmZXRjaGVzIChpdHMgbG9hZGVyIGJ5cGFzc2VzIEh0dHBDbGllbnQpLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgLy8gQSBkaWZmZXJlbnQgaW1hZ2Ugd2FzIHNlbGVjdGVkIOKAlCBzdG9wIHRoZSBwcmV2aW91cyBzdGFjaydzIGJhY2tncm91bmRcbiAgICAvLyBsb2FkaW5nIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxldHRpbmcgaXQgZmluaXNoIGJlaGluZCB0aGUgbmV3IGltYWdlLlxuICAgIGlmIChmaWxlbmFtZSAmJiB0aGlzLmN1cnJlbnRGaWxlTmFtZSAmJiBmaWxlbmFtZSAhPT0gdGhpcy5jdXJyZW50RmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAgIHRoaXMucmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTtcbiAgICB9XG4gICAgdGhpcy5zaW1wbGVTdGFjay5ub3RlQWN0aXZlRmlsZShmaWxlbmFtZSk7XG4gICAgLy8gU2ltcGxlIChpbi1tZW1vcnkgLyBub24tdGlsZWQpIGltYWdlOiBza2lwIHRoZSB0aWxlIHNlcnZlciBlbnRpcmVseSDigJQgbm9cbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQsIG5vIC90aWxlcy9pbmZvIHBvbGwuIGB1cmxzW3pJbmRleF1gIGlzIGEgY29tcGxldGUgaW1hZ2VcbiAgICAvLyBPU0Qgb3BlbnMgdmlhIGl0cyBzaW5nbGUtaW1hZ2Ugc291cmNlIChzZWUgcGxvdCgpKS5cbiAgICBpZiAodGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbWFnZUluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkU2ltcGxlKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXMuZ2V0QXV0aEhlYWRlcnMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTsgLy8gZmFsbCBiYWNrIHRvIGNvb2tpZSBhdXRoIChhamF4V2l0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgICAvLyBQb2xsIC90aWxlcy9pbmZvOiB0aGUgYmFja2VuZCByZXR1cm5zIDIwMiB3aGlsZSB0aGUgc291cmNlIGZpbGUgaXMgc3RpbGxcbiAgICAvLyBiZWluZyBjYWNoZWQgKEdDUy0+UFZDKSDigJQgaXQga2lja3MgdGhlIGRvd25sb2FkIG9mZiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBlYWNoIHJlcXVlc3QgaXMgc2hvcnQgKG5vIGxvbmctaGVsZCBjb25uZWN0aW9uIHRvIHRyaXAgaW5ncmVzcy9wcm94eSBvclxuICAgIC8vIGNsaWVudCB0aW1lb3V0cyksIGFuZCAyMDAgd2l0aCB0aGUgZGVzY3JpcHRvciBvbmNlIGl0J3MgcmVhZHkuIFRoZVxuICAgIC8vIGNhY2hlLXByb2dyZXNzIG92ZXJsYXkgc2hvd3MgcHJvZ3Jlc3MgZHVyaW5nIHRoZSB3YWl0LiBXZSBnaXZlIHVwIGFmdGVyXG4gICAgLy8gdGlsZXNJbmZvVGltZW91dE1zIHNvIHRoZSByZW5kZXIgcGlwZWxpbmUgbmV2ZXIgaGFuZ3MgKHRoZSByb3V0ZXIgdGhlblxuICAgIC8vIGZhbGxzIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlKS5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy50aWxlc0luZm9UaW1lb3V0TXM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbGVzL2luZm8gbm90IHJlYWR5IGJlZm9yZSBkZWFkbGluZSDigJQgZmlsZSBzdGlsbCBjYWNoaW5nJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxUaWxlRGVzY3JpcHRvcj4odXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZSh0aW1lb3V0KDQ1MDAwKSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwICYmIHJlc3AuYm9keSkge1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHJlc3AuYm9keTtcbiAgICAgICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiByZXNwLmJvZHksIGluZm9CNjQsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiBBY2NlcHRlZCAob3IgZW1wdHkgYm9keSkg4oaSIHN0aWxsIGNhY2hpbmc7IGZhbGwgdGhyb3VnaCBhbmQgcmUtcG9sbC5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUb2xlcmF0ZSB0cmFuc2llbnQgZmFpbHVyZXMgV0hJTEUgdGhlIGZpbGUgaXMgYmVpbmcgcHJlcGFyZWQ6IGEgc2xvd1xuICAgICAgICAvLyBtZXRhZGF0YSByZWFkIG9uIGEgbXVsdGktR0IgZmlsZSAoSUZEIHdhbGspLCBhIDV4eCBtaWQtcGlwZWxpbmUsIGFcbiAgICAgICAgLy8gcHJveHkgaGljY3VwLiBBIHNpbmdsZSBiYWQgcG9sbCBtdXN0IE5PVCBkcm9wIHVzIHRvIFBsb3RseSDigJQgYSBsYXJnZVxuICAgICAgICAvLyBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhpcyBidXN5IHdpbmRvdywgc28gYmFpbGluZyBoZXJlIGlzIHdoeVxuICAgICAgICAvLyBpdCBcImFsd2F5cyBlbmRzIHVwIG9uIFBsb3RseVwiLiBLZWVwIHBvbGxpbmcgdW50aWwgcmVhZHkgb3IgZGVhZGxpbmUuXG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDE1MDApKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIGBwbG90KClgIHBheWxvYWQgZm9yIGEgc2ltcGxlICh0aWxlZDpmYWxzZSkgaW1hZ2U6IGEgc2luZ2xlLWxldmVsXG4gICAqICBkZXNjcmlwdG9yIHNpemVkIGZyb20gYHRydWVJbWFnZVNpemVgLCBwbHVzIHRoZSBkaXJlY3RseS1sb2FkYWJsZSBVUkwg4oCUXG4gICAqICByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEge0BsaW5rIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZX0gKHNoYXJlZCB3aXRoXG4gICAqICBuYXBhcmktanM7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSByYXcgYGZldGNoKClgL2A8aW1nPmApLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGUoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgeiA9IHpJbmRleCB8fCAwO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IG1ldGEgPSBpbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgLy8gU0VSVkVSTEVTUyBNVUxUSUNIQU5ORUw6IGNvbXBvc2l0ZSB0aGUgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXNcbiAgICAvLyBjbGllbnQtc2lkZSAobm8gdGlsZSBzZXJ2ZXIpLCBkcml2ZW4gYnkgdGhlIGNoYW5uZWwgcGFuZS4gS2VwdCBPRkYgdGhlXG4gICAgLy8gdGlsZWQgaXNNdWx0aUNoYW5uZWwgcGF0aCAoc2VlIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCkuXG4gICAgY29uc3QgY2hVcmxzID0gaW1hZ2VJbmZvLmNoYW5uZWxVcmxzO1xuICAgIHRoaXMuc2ltcGxlTXVsdGljaGFubmVsID0gISFjaFVybHM/Lmxlbmd0aCAmJiAobWV0YT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBsZXQgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gY2hVcmxzIGFzIHN0cmluZ1tdW107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKGNoVXJscyFbel0gPz8gY2hVcmxzIVswXSk7XG4gICAgICAgIHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgIC8vIE5COiBoaXN0b2dyYW1zIGFyZSBiaW5uZWQgaW4gcGxvdCgpLCBBRlRFUiBkZXN0cm95Vmlld2VyIGNsZWFycyB0aGVcbiAgICAgICAgLy8gc2FtcGxlciDigJQgY29tcHV0aW5nIHRoZW0gaGVyZSB3b3VsZCBiZSB3aXBlZCBieSB0aGF0IGNsZWFyLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgZmFpbGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IFtdO1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gW107XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVN0YWNrLnVybEZvcihpbWFnZUluZm8sIHopO1xuICAgICAgaWYgKHJhd1VybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybCk7XG4gICAgICAgICAgLy8gVXBzY2FsZSB0aGUgKGRvd25zY2FsZWQpIHByZXZpZXcgdG8gZnVsbCByZXNvbHV0aW9uIHNvIE9TRCdzIHdvcmxkXG4gICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2Ug4oCUIHNlZSB0b0Z1bGxSZXNVcmwuXG4gICAgICAgICAgdXJsID0gYXdhaXQgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsb2FkYWJsZSBVUkwgKGVtcHR5IHVybHNbXSBvciB0aGUgZmV0Y2ggZmFpbGVkKTogc2lnbmFsIFwiY291bGRuJ3RcbiAgICAvLyBsb2FkXCIgd2l0aCBhIG51bGwgZGVzY3JpcHRvciDigJQgc2FtZSBhcyB0aGUgdGlsZWQgcGF0aCB3aGVuIHRoZXJlJ3Mgbm9cbiAgICAvLyBzZWxlY3RlZC1maWxlIGluZm8g4oCUIHNvIHBsb3QoKSByZXR1cm5zIGZhbHNlIChpdHMgYGlmICghZClgIGd1YXJkKSBhbmRcbiAgICAvLyB0aGUgcm91dGVyIGNhbiBmYWxsIGJhY2ssIGluc3RlYWQgb2YgbW91bnRpbmcgYW4gPGltZz4gd2l0aCBhbiB1bmRlZmluZWRcbiAgICAvLyBzcmMgdGhhdCB0aHJvd3MgYXQgcnVudGltZS5cbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBoYXMgbm8gbG9hZGFibGUgVVJMOyBza2lwcGluZyBPU0QgcmVuZGVyJywgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHosIGZpbGVuYW1lIH07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aWxlU2l6ZTogMCwgICAgICAgICAgICAvLyB1bnVzZWQ6IHNpbXBsZSBtb2RlIG5ldmVyIGNhbGxzIGJ1aWxkVGlsZVNvdXJjZVxuICAgICAgejogMSwgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGZyYW1lXG4gICAgICBjaGFubmVsczogbWV0YT8ucmdiQ2hhbm5lbHMgPz8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSA/IDEgOiAzKSxcbiAgICAgIG11bHRpY2hhbm5lbDogZmFsc2UsXG4gICAgICByZWFsTGV2ZWxzOiAxLFxuICAgICAgbGV2ZWxzOiBbeyByZXM6IDAsIHdpZHRoLCBoZWlnaHQgfV0sXG4gICAgICBtcHBYOiBtZXRhPy5tcHBYID8/IDAsXG4gICAgICBtcHBZOiBtZXRhPy5tcHBZID8/IDAsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZm9CNjQ6ICcnLFxuICAgICAgeixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc2ltcGxlOiB0cnVlLFxuICAgICAgdXJsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT1NEJ3MgYHt0eXBlOidpbWFnZSd9YCBzb3VyY2Ugc2l6ZXMgaXRzIGNvb3JkaW5hdGUgd29ybGQgdG8gdGhlIGltYWdlJ3NcbiAgICogTkFUVVJBTCBwaXhlbHMuIEEgZm9sZGVyLXN0YWNrIHNsaWNlIGlzIGEgc2VydmVyIGAvcHJldmlld2Agd2hvc2UgcGl4ZWwgc2l6ZVxuICAgKiBuZWVkbid0IG1hdGNoIHRoZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ug4oCUIGl0IG1heSBiZSBkb3duc2NhbGVkIChsYXJnZVxuICAgKiBpbWFnZXMpIE9SIGxhcmdlciB0aGFuIHRoZSBkaW1lbnNpb25zIGAvbWV0YWRhdGFgIHJlcG9ydHMuIEVpdGhlciB3YXkgT1NEJ3NcbiAgICogd29ybGQgd291bGQgZGlmZmVyIGZyb20gdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIChRdVBhdGggZ2VvanNvbixcbiAgICogaW4gbGV2ZWwtMCBwaXhlbHMpOiBhIHNtYWxsZXIgcHJldmlldyByZW5kZXJzIFJPSXMgb3ZlcnNpemVkLCBhIGxhcmdlciBvbmVcbiAgICogcmVuZGVycyB0aGVtIHVuZGVyc2l6ZWQvb2Zmc2V0LiBSZXNhbXBsZSB0aGUgcHJldmlldyB0byBFWEFDVExZIHRoZVxuICAgKiBmdWxsLXJlc29sdXRpb24gZGltZW5zaW9ucyAoYmx1cnJ5IGJ1dCBwb3NpdGlvbmFsbHkgZXhhY3Qg4oCUIHNjYWxpbmcgdXAgb3JcbiAgICogZG93biBhcyBuZWVkZWQpIHNvIE9TRCdzIHdvcmxkIG1hdGNoZXMgdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlLCB3aGlsZSBzdGlsbFxuICAgKiB1c2luZyBPU0QncyByZWxpYWJsZSBzaW5nbGUtaW1hZ2UgcmVuZGVyZXIuIENhY2hlZCBwZXIgcHJldmlldyBVUkwgKHJldm9rZWRcbiAgICogb24gZmlsZSBjaGFuZ2UpOyBhIG5vLW9wIHdoZW4gdGhlIHByZXZpZXcgaXMgYWxyZWFkeSBleGFjdGx5IGZ1bGwtcmVzIChzbWFsbFxuICAgKiBpbWFnZXMsIGluLW1lbW9yeSBwaXBlbGluZSBibG9icyksIHdoZW4gdGhlIGRpbXMgYXJlIHVua25vd24sIG9yIHdoZW5cbiAgICogdGhleSdyZSBpbXBsYXVzaWJseSBsYXJnZSAoZ3VhcmRzIGFnYWluc3QgYW4gZW5vcm1vdXMgY2FudmFzKS4gKGppdC11aSM5MylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdG9GdWxsUmVzVXJsKHByZXZpZXdVcmw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSA+IHRoaXMuU0lNUExFX1VQU0NBTEVfTUFYX0RJTSkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5nZXQocHJldmlld1VybCk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHByZXZpZXdVcmw7IC8vIGNvdWxkbid0IGRlY29kZSDigJQgbGV0IE9TRCB0cnkgdGhlIFVSTCBhcy1pc1xuICAgIH1cbiAgICAvLyBBbHJlYWR5IHRoZSBleGFjdCBmdWxsLXJlcyB3b3JsZCDigJQgbm8gcmVzYW1wbGUgbmVlZGVkLiAoQSBwcmV2aWV3IHRoYXQgaXNcbiAgICAvLyBsYXJnZXIgT1Igc21hbGxlciB0aGFuIGZ1bGwtcmVzIG11c3Qgc3RpbGwgYmUgcmVzaXplZCBzbyBPU0QncyB3b3JsZCA9PVxuICAgIC8vIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZTsgb25seSBhbiBleGFjdCBtYXRjaCBpcyBza2lwcGFibGUuKVxuICAgIGlmIChpbWcubmF0dXJhbFdpZHRoID09PSB3aWR0aCAmJiBpbWcubmF0dXJhbEhlaWdodCA9PT0gaGVpZ2h0KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7IC8vIHNjYWxlIHByZXZpZXcgKHVwIG9yIGRvd24pIHRvIGZ1bGwtcmVzXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4gY2FudmFzLnRvQmxvYihyZXNvbHZlKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBmdWxsUmVzVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnNldChwcmV2aWV3VXJsLCBmdWxsUmVzVXJsKTtcbiAgICByZXR1cm4gZnVsbFJlc1VybDtcbiAgfVxuXG4gIC8qKiBTYW1wbGUgYSBTSU1QTEUtbW9kZSBzbGljZSdzIG93biBkZWNvZGVkIHBpeGVscyBpbnRvIHRoZSBoaXN0b2dyYW0g4oCUIHRoZVxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHNhbXBsZXJzIChubyB0aWxlIHNlcnZlcikuIEZpcmUtYW5kLWZvcmdldDtcbiAgICogIGEgZGVjb2RlIGZhaWx1cmUganVzdCBsZWF2ZXMgdGhlIHBhbmUgZW1wdHkgcmF0aGVyIHRoYW4gdGhyb3dpbmcuICovXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHVybCk7XG4gICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgaWYgKCF3IHx8ICFoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6LCBkYXRhLCB0aGlzLmlzR3JheXNjYWxlSW1hZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBoaXN0b2dyYW0gc2FtcGxlIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoICsgZGVjb2RlIGEgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXMgKHNpbmdsZS1iYW5kIGdyYXlzY2FsZSkgaW50b1xuICAgKiAgcGl4ZWwgYnVmZmVycywgZm9yIHRoZSBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCBjb21wb3NpdG9yLiBBdXRoLXNhZmU6IGdvZXNcbiAgICogIHRocm91Z2ggU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChibG9iOi9kYXRhOiBhcy1pczsgaHR0cCB2aWEgSHR0cENsaWVudCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJsczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChjb25zdCB1IG9mIHVybHMgPz8gW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHUpO1xuICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICBpZiAoIXcgfHwgIWgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWN0eCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGNoYW5uZWwgcGxhbmUgZGVjb2RlIGZhaWxlZCcsIGVycik7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBwbGFuZXM7XG4gIH1cblxuICAvKiogQ29tcG9zaXRlIHRoZSBjYWNoZWQgcGVyLWNoYW5uZWwgcGxhbmVzIGludG8gT05FIFJHQkEgaW1hZ2UgdXNpbmcgdGhlXG4gICAqICBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIChjb2xvdXIvd2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIOKAlCB0aGUgY2xpZW50LXNpZGUsXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgcGVyLWNoYW5uZWwgJ2xpZ2h0ZXInIGNvbXBvc2l0b3JcbiAgICogIChzYW1lIGRpc3BsYXkuY2hhbm5lbFJnYkx1dCBtYXRoIGFzIHJlY29sb3JDaGFubmVsVGlsZSwgYXBwbGllZCBwZXItcGxhbmUpLlxuICAgKiAgUmV0dXJucyBhIGJsb2I6IFVSTCBvZiB0aGUgY29tcG9zaXRlIFBORywgcmV2b2tpbmcgdGhlIHByZXZpb3VzIG9uZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwbGFuZXMgPSB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXM7XG4gICAgaWYgKCFwbGFuZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHcgPSBwbGFuZXNbMF0ud2lkdGgsIGggPSBwbGFuZXNbMF0uaGVpZ2h0O1xuICAgIGlmICghdyB8fCAhaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHcgKiBoICogNCk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBwbGFuZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzW2NdO1xuICAgICAgaWYgKHN0ICYmIHN0LnZpc2libGUgPT09IGZhbHNlKSBjb250aW51ZTsgLy8gaGlkZGVuIGNoYW5uZWwgY29udHJpYnV0ZXMgbm90aGluZ1xuICAgICAgY29uc3QgcGxhbmUgPSBwbGFuZXNbY107XG4gICAgICBpZiAocGxhbmUud2lkdGggIT09IHcgfHwgcGxhbmUuaGVpZ2h0ICE9PSBoIHx8ICFwbGFuZS5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICBjb25zdCB7IHIsIGcsIGIgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICAgIGNvbnN0IHBkID0gcGxhbmUuZGF0YTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChwZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsdW0gPSBwZFtpXTsgLy8gc2luZ2xlLWJhbmQgcGxhbmUgKFI9Rz1CKVxuICAgICAgICBvdXRbaV0gKz0gcltsdW1dOyAgICAgICAgICAvLyBVaW50OENsYW1wZWRBcnJheSBjbGFtcHMg4oaSIGFkZGl0aXZlICgnbGlnaHRlcicpXG4gICAgICAgIG91dFtpICsgMV0gKz0gZ1tsdW1dO1xuICAgICAgICBvdXRbaSArIDJdICs9IGJbbHVtXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIG91dFtpXSA9IDI1NTsgLy8gb3BhcXVlXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG91dCwgdywgaCksIDAsIDApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlcykgPT4gY2FudmFzLnRvQmxvYihyZXMsICdpbWFnZS9wbmcnKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7XG4gICAgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHJldHVybiB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybDtcbiAgfVxuXG4gIC8qKiBSZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkIHBsYW5lcyAobmV3IGNoYW5uZWwgc3RhdGVzKVxuICAgKiAgYW5kIHJlLW9wZW4g4oCUIHRoZSBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgaW52YWxpZGF0ZS1vbi1jaGFubmVsLWNoYW5nZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbXBvc2l0ZUFuZE9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICBpZiAoIXVybCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0cnkgeyB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTsgfSBjYXRjaCB7IC8qIHZpZXdlciBnb25lICovIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGEgVVJMIGludG8gYW4gSFRNTEltYWdlRWxlbWVudCAocmVzb2x2ZXMgb25jZSBkZWNvZGVkKS4gVXNlc1xuICAgKiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCByYXRoZXIgdGhhbiBgbmV3IEltYWdlKClgIGJlY2F1c2UgdGhpcyBmaWxlJ3NcbiAgICogIGBJbWFnZWAgaW1wb3J0IGlzIGltYWdlLWpzJ3MgZGVjb2Rlciwgbm90IHRoZSBET00gZWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VFbCh1cmw6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG4gICAgICBpbWcub25lcnJvciA9IChlKSA9PiByZWplY3QoZSk7XG4gICAgICBpbWcuc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXZva2VTaW1wbGVGdWxsUmVzVXJscygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy52YWx1ZXMoKSkgVVJMLnJldm9rZU9iamVjdFVSTCh1KTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpOyB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IG51bGw7IH1cbiAgfVxuXG4gIC8qKiBNb3VudCB0aGUgdmlld2VyIHdpdGggYSBjdXN0b20gdGlsZSBzb3VyY2UgcG9pbnRpbmcgYXQgYEdFVCAvdGlsZWAuICovXG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiBhbnksXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIF9zY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBfcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBpbWFnZUxvYWRlZCBhcyBPc2RMb2FkZWQ7XG4gICAgY29uc3QgZCA9IGxvYWRlZD8uZGVzY3JpcHRvcjtcbiAgICBpZiAoIWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIC8vIFJlLWVzdGFibGlzaCB0aGUgY29sb3JtYXAgc3Vic2NyaXB0aW9uIGlmIGEgcHJpb3IgY29tcG9uZW50IHRlYXJkb3duXG4gICAgLy8gKHVuc3Vic2NyaWJlKCkpIHRvcmUgaXQgZG93biDigJQgdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdCBzaW5nbGV0b24sIHNvIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yIHdvbid0IHJ1biBhZ2FpbiB0byByZWNyZWF0ZSBpdC5cbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gICAgLy8gT1NEIHRpbGVzIG5hdGl2ZWx5LCBzbyB0aGUgaW4tcGxhY2UgKGxhcmdlKSBwYXNzIGlzIG5vcm1hbGx5IGEgbm8tb3BcbiAgICAvLyBvbmNlIG1vdW50ZWQg4oCUIHRoZSB0aWxlIHB5cmFtaWQgSVMgdGhlIGZ1bGwgcmVzb2x1dGlvbiByZWdhcmRsZXNzIG9mXG4gICAgLy8gd2hpY2ggSW1hZ2VJbmZvIHRpZXIgcmVxdWVzdGVkIGl0LiBTaW1wbGUgbW9kZSBoYXMgbm8gcHlyYW1pZCB0byBmYWxsXG4gICAgLy8gYmFjayBvbjogaXQgZGlzcGxheXMgbGl0ZXJhbGx5IHdoYXRldmVyIFVSTCB3YXMgbGFzdCBvcGVuZWQsIHNvXG4gICAgLy8gd2l0aG91dCB0aGlzIHN3YXAgdGhlIHNtYWxsIHRpZXIncyAxMjhweCBwbGFjZWhvbGRlciB3b3VsZCBzdGF5IG9uXG4gICAgLy8gc2NyZWVuIGZvcmV2ZXIgKHBpeGVsYXRlZCwgbmV2ZXIgXCJzaGFycGVuaW5nXCIgbGlrZSB0aGUgdGlsZWQgcGF0aCkuXG4gICAgaWYgKGluUGxhY2UgJiYgdGhpcy52aWV3ZXIpIHtcbiAgICAgIGlmIChsb2FkZWQuc2ltcGxlICYmIGxvYWRlZC51cmwpIHtcbiAgICAgICAgLy8gQWxzbyByZWZyZXNoIHNpbXBsZVVybHMgdG8gVEhJUyBwaGFzZSdzIChsYXJnZS10aWVyKSB1cmxzW10g4oCUIGl0IHdhc1xuICAgICAgICAvLyBzZXQgZnJvbSB0aGUgc21hbGwgdGllcidzIDEyOHB4IHVybHMgb24gdGhlIGluaXRpYWwgbW91bnQgYmVsb3csXG4gICAgICAgIC8vIHdoaWNoIG5ldmVyIHJ1bnMgYWdhaW4gZm9yIHRoZSBpbi1wbGFjZSBwYXNzLiBXaXRob3V0IHRoaXMsXG4gICAgICAgIC8vIHNldFpJbmRleCdzIGxhdGVyIHNsaWRlciBzY3J1YnMgd291bGQga2VlcCByZWFkaW5nIHRoZSBzbWFsbFxuICAgICAgICAvLyB0aWVyJ3MgbG93LXJlcyBVUkxzIGZvcmV2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBpbml0aWFsIHNsaWNlIHdhc1xuICAgICAgICAvLyBjb3JyZWN0bHkgc3dhcHBlZCB0byBmdWxsIHJlc29sdXRpb24gaGVyZS5cbiAgICAgICAgdGhpcy5zaW1wbGVVcmxzID0gaW1hZ2VJbmZvPy51cmxzID8/IHRoaXMuc2ltcGxlVXJscztcbiAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIHRoaXMuY3VycmVudEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0b3IgPSBkO1xuICAgIHRoaXMuaW5mb0I2NCA9IGxvYWRlZC5pbmZvQjY0O1xuICAgIHRoaXMuY3VycmVudFogPSBsb2FkZWQuejtcbiAgICB0aGlzLnNpbXBsZU1vZGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgdGhpcy5zaW1wbGVVcmxzID0gbG9hZGVkLnNpbXBsZSA/IChpbWFnZUluZm8/LnVybHMgPz8gW10pIDogW107XG4gICAgLy8gVGhlIGRlc2NyaXB0b3IncyBwaHlzaWNhbCBwaXhlbCBzaXplIChzZXJ2ZXIgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBwdXNoIGl0IGludG8gdGhlIHNoYXJlZCBtZXRhIHNvIHRoZSBSZWdpb24gRWRpdG9yIHJlcG9ydHNcbiAgICAvLyBhcmVhcyBpbiDCtW3Csi9tbcKyLCBtYXRjaGluZyB0aGUgc2NhbGUgYmFyIGJ1aWx0IGZyb20gYGQubXBwWGAgYmVsb3cuXG4gICAgdGhpcy5zdG9yZS5zZXRQaHlzaWNhbFBpeGVsU2l6ZShkLm1wcFgsIGQubXBwWSk7XG4gICAgLy8gVXNlIHRoZSBTQU1FIGdyYXlzY2FsZSBmbGFnIHRoZSBjb2xvcm1hcCBkcm9wZG93biAvIFBsb3RseSB1c2VcbiAgICAvLyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlIOKGkCByZ2JDaGFubmVscyA9PT0gMSkuIFRoZSBkZXNjcmlwdG9yJ3MgYGNoYW5uZWxzYFxuICAgIC8vIChjaGFubmVsQ291bnQpIGRpdmVyZ2VzIGZyb20gcmdiQ2hhbm5lbHMgZm9yIHN0YWNrcywgd2hpY2ggbGVmdCBncmF5c2NhbGVcbiAgICAvLyBzdGFja3MgdW4tcmVjb2xvcmVkIGV2ZW4gdGhvdWdoIHRoZSBjb2xvcm1hcCBzZWxlY3RvciB3YXMgc2hvd24uXG4gICAgdGhpcy5pc0dyYXlzY2FsZUltYWdlID0gISFpbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgIC8vIFNpbXBsZSAobm9uLXRpbGVkLCBpbi1tZW1vcnkpIGltYWdlOiBubyBweXJhbWlkLCBubyBwZXItY2hhbm5lbCB0aWxlcywgYW5kXG4gICAgLy8gbm8gc2VydmVyLXNpZGUgaW50ZW5zaXR5IHNhbXBsaW5nIOKAlCBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXNcbiAgICAvLyB1cmxzW3pdIGRpcmVjdGx5LiBTa2lwIHRoZSB3aG9sZSB0aWxlZC1zZXR1cCBwYXRoIGJlbG93LlxuICAgIGNvbnN0IHNpbXBsZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICBpZiAoc2ltcGxlKSB7XG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSAxO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2VydmVybGVzcyBoaXN0b2dyYW0g4oCUIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgKGl0cyBsYXN0IGFjdCBpcyBzYW1wbGVyLmNsZWFyKCkpLlxuICAgICAgLy8gTXVsdGljaGFubmVsIGJpbnMgZWFjaCBjYWNoZWQgY2hhbm5lbCBwbGFuZTsgc2luZ2xlLWJhbmQgLyBSR0IgYmlucyB0aGVcbiAgICAgIC8vIGRlY29kZWQgZnJhbWUncyBvd24gcGl4ZWxzLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyhsb2FkZWQueiwgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgdGhpcy5zYW1wbGVTaW1wbGVIaXN0b2dyYW0obG9hZGVkLnVybCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChpbmRleGVkL0xVVC1iZWFyaW5nIHN0YWNrcykgY29tcG9zaXRlIGNsaWVudC1zaWRlXG4gICAgICAvLyBmcm9tIHBlci1jaGFubmVsIHRpbGVzLiBUcnVzdCB0aGUgc2VydmVyJ3MgZXhwbGljaXQgYG11bHRpY2hhbm5lbGAgZmxhZyDigJQgdGhlXG4gICAgICAvLyBvbGQgYGNoYW5uZWxzPjEgJiYgZ3JheXNjYWxlYCBoZXVyaXN0aWMgYWxzbyBtYXRjaGVkIFJHQiBwaG90b3MgQmlvLUZvcm1hdHNcbiAgICAgIC8vIHJlYWRzIGFzIHNlcGFyYXRlZCBwbGFuZXMgKGNoYW5uZWxzPjEsIHJnYkNoYW5uZWxzPT0xKSwgc3BsaXR0aW5nIHRoZW0gaW50byBOXG4gICAgICAvLyBwZXItY2hhbm5lbCBUaWxlZEltYWdlcyB0aGF0IGZsb29kZWQgdGhlIHRpbGUgZW5kcG9pbnQgYW5kIGh1bmcgb24gbG9hZC5cbiAgICAgIHRoaXMucmVhbExldmVscyA9IGQucmVhbExldmVscyA/PyBkLmxldmVscy5sZW5ndGg7XG4gICAgICAvLyBUaWxlcyB0byBjb3ZlciB0aGUgd2hvbGUgaW1hZ2UgYXQgdGhlIGNvYXJzZXN0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWwgKHRoZVxuICAgICAgLy8gc21hbGxlc3QgbGV2ZWwgdGhhdCBoYXMgcmVhbCwgcGVyLWNoYW5uZWwtZmV0Y2hhYmxlIHRpbGVzIOKAlCBzeW50aGV0aWMgb3ZlcnZpZXdcbiAgICAgIC8vIGxldmVscyBhcmUgc2VydmVyLWNvbXBvc2l0ZWQgb25seSkuIEEgcHlyYW1pZGFsIGltYWdlJ3MgY29hcnNlc3QgcmVhbCBsZXZlbCBpc1xuICAgICAgLy8gdGlueSAoZmV3IHRpbGVzKTsgYSBmbGF0L25vLXB5cmFtaWQgaW1hZ2UncyBpcyB0aGUgZnVsbC1yZXMgZ3JpZCAobWFueSB0aWxlcykuXG4gICAgICBjb25zdCBjb2Fyc2UgPSBkLmxldmVsc1t0aGlzLnJlYWxMZXZlbHMgLSAxXSA/PyBkLmxldmVsc1tkLmxldmVscy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGNvYXJzZVcgPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLndpZHRoIC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlSCA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2UuaGVpZ2h0IC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlVGlsZXMgPSBjb2Fyc2VXICogY29hcnNlSDtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSAhIWQubXVsdGljaGFubmVsO1xuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgLy8gUGVyLWNoYW5uZWwgcmVuZGVyaW5nIGNhbiBvbmx5IHVzZSB0aGUgUkVBTCBsZXZlbHMsIHNvIE9TRCByZXF1ZXN0cyB0aGVcbiAgICAgICAgLy8gY29hcnNlc3QgcmVhbCBsZXZlbCdzIHdob2xlIHRpbGUgZ3JpZCDDlyBOIGNoYW5uZWxzIGF0IGZpdC4gV2hlbiB0aGF0J3MgbGFyZ2VcbiAgICAgICAgLy8gKGEgd2hvbGUtc2xpZGUpLCBpdCdzIHRvbyBtYW55IChvZnRlbiBzbG93LCBweXJhbWlkLWxlc3MpIGZ1bGwtcmVzIHJlYWRzIOKAlFxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZSBzZXJ2ZXItY29tcG9zaXRlZCBzb3VyY2UgKHdoaWNoIGtlZXBzIHRoZSBmYXN0XG4gICAgICAgIC8vIHN5bnRoZXRpYyBvdmVydmlld3MpLiBBIHNtYWxsIHNpbmdsZS1GT1Ygei1zdGFjayBzdGF5cyBwZXItY2hhbm5lbC4gU2l6ZSBpblxuICAgICAgICAvLyBCWVRFUyBpc24ndCB0aGUgc2lnbmFsIOKAlCB0aWxlIGNvdW50IGlzLlxuICAgICAgICBjb25zdCBmaXRUaWxlcyA9IGNvYXJzZVRpbGVzICogTWF0aC5tYXgoMSwgZC5jaGFubmVscyA/PyAxKTtcbiAgICAgICAgaWYgKGZpdFRpbGVzID4gdGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFUykge1xuICAgICAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW09TRF0gbXVsdGljaGFubmVsIGNvbXBvc2l0ZSB0b28gbGFyZ2UgZm9yIHBlci1jaGFubmVsIHJlbmRlcmluZzogJyArXG4gICAgICAgICAgICBgJHtjb2Fyc2VXfXgke2NvYXJzZUh9IHRpbGVzIHggJHtkLmNoYW5uZWxzfSBjaGFubmVscyA9ICR7Zml0VGlsZXN9IGF0IHRoZSBjb2Fyc2VzdCBgICtcbiAgICAgICAgICAgIGByZWFsIGxldmVsICg+ICR7dGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFU30pOyByZW5kZXJpbmcgc2VydmVyLWNvbXBvc2l0ZWQgZm9yIHNwZWVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIC8vIEF1dG8tcmFuZ2UgZ3JheXNjYWxlIHRpbGVzIHRvIHRoZSBpbWFnZSdzIGFjdHVhbCBpbnRlbnNpdHkgc3BhbiAobGlrZSB0aGVcbiAgICAgIC8vIGhlYXRtYXApLCBzYW1wbGluZyB0aGUgY29hcnNlc3QgdGlsZSBsZXZlbCBzbyB0aGUgd2luZG93IG1hdGNoZXMgdGhlIHJhd1xuICAgICAgLy8gdGlsZSB2YWx1ZXMuIEZpcmUtYW5kLWZvcmdldDogaXQgcmUtaW52YWxpZGF0ZXMgb25jZSB0aGUgd2luZG93IGlzIGtub3duO1xuICAgICAgLy8gdGlsZXMgcGFpbnQgdW53aW5kb3dlZCB1bnRpbCB0aGVuLiAoTXVsdGljaGFubmVsIHdpbmRvd3MgYXJlIHBlci1jaGFubmVsLFxuICAgICAgLy8gZGVmYXVsdGluZyB0byBmdWxsIHJhbmdlOyB0aGUgdXNlciBhdXRvL2VkaXRzIGVhY2ggY2hhbm5lbC4pXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3coZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2l6ZSB0aGUgc2xpY2UgY2FjaGUgZm9yIHRoaXMgaW1hZ2U6IExSVSBjYXAgdG8gaG9sZCB0aGUgd2hvbGUgc3RhY2tcbiAgICAgIC8vIChjYXBwZWQpIGFuZCBza2lwIGJhY2tncm91bmQgcHJlbG9hZGluZyBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBwcmVsb2FkXG4gICAgICAvLyAod291bGQgZmxvb2QgZnVsbC1yZXMgcmVhZHMpLiBOb3JtYWwgc3RhY2tzIGtlZXAgdGhlIGZsaWNrZXItZnJlZSBwcmUtY2FjaGUuXG4gICAgICB0aGlzLmNhY2hlLmNvbmZpZ3VyZShkLnogPz8gMSwgY29hcnNlVGlsZXMpO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBtb2RlOiBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXMgdGhlIFVSTCAoYmxvYjovZGF0YTovaHR0cClcbiAgICAvLyBkaXJlY3RseSDigJQgbm8gcHlyYW1pZCwgbm8gc2VydmVyLiBUaWxlZCBtb2RlOiB0aGUgY3VzdG9tIHNlcnZlci1iYWNrZWQgdGlsZVxuICAgIC8vIHNvdXJjZSAobXVsdGljaGFubmVsIG9wZW5zIG9uIGNoYW5uZWwgMDsgdGhlIG9wZW4gaGFuZGxlciB0aGVuIHN3YXBzIGluIHRoaXNcbiAgICAvLyBzbGljZSdzIHBlci1jaGFubmVsIGdyb3VwIGFuZCB0aGUgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0KS5cbiAgICBjb25zdCB0aWxlU291cmNlID0gc2ltcGxlXG4gICAgICA/IHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH1cbiAgICAgIDogdGhpcy5idWlsZFRpbGVTb3VyY2UoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56LCB0aGlzLmlzTXVsdGlDaGFubmVsID8gMCA6IHVuZGVmaW5lZCk7XG4gICAgc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpO1xuICAgIHRoaXMudmlld2VyID0gKE9TRCBhcyBhbnkpKHtcbiAgICAgIGlkOiBwbG90RGl2LFxuICAgICAgLy8gU2ltcGxlLW1vZGUgei1zY3J1YiBjYWxscyB2aWV3ZXIub3BlbigpIGFnYWluIHBlciBzbGljZSAoc2VlXG4gICAgICAvLyBzZXRaSW5kZXgpIOKAlCB3aXRob3V0IHRoaXMgaXQgcmVzZXRzIHRvIHRoZSBob21lIHpvb20vcGFuIG9uIGV2ZXJ5XG4gICAgICAvLyBzbGljZSBjaGFuZ2UuIFRpbGVkIG1vZGUgbmV2ZXIgcmUtb3BlbnMgKGl0IHRvZ2dsZXMgcHJlLWFkZGVkXG4gICAgICAvLyBUaWxlZEltYWdlcycgb3BhY2l0eSBpbnN0ZWFkKSwgc28gdGhpcyBpcyBhIG5vLW9wIHRoZXJlLlxuICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgIC8vIFVzZSB0aGUgMkQgY2FudmFzIGRyYXdlciwgbm90IFdlYkdMOiBjcmVhdGluZy9kZXN0cm95aW5nIGEgdmlld2VyIG9uXG4gICAgICAvLyBlYWNoIGVuZ2luZSB0b2dnbGUgLyBpbWFnZSBsb2FkIGNodXJucyBXZWJHTCBjb250ZXh0cyAoYnJvd3NlcnMgY2FwXG4gICAgICAvLyBob3cgbWFueSBleGlzdCBhdCBvbmNlKSwgd2hpY2ggc3VyZmFjZXMgYXMgXCJXZWJHTCBjb250ZXh0IHdhcyBsb3N0XCJcbiAgICAgIC8vIGFuZCBibGFuayB0aWxlcy4gVGhlIGNhbnZhcyBkcmF3ZXIgaGFzIG5vIHN1Y2ggbGltaXQuXG4gICAgICBkcmF3ZXI6ICdjYW52YXMnLFxuICAgICAgc2hvd05hdmlnYXRpb25Db250cm9sOiBmYWxzZSwgLy8gYXZvaWRzIG5lZWRpbmcgdGhlIGljb24taW1hZ2UgYXNzZXRzXG4gICAgICAvLyBPdmVydmlldyB0aHVtYm5haWwgd2l0aCB0aGUgY3VycmVudC12aWV3cG9ydCByZWN0YW5nbGUsIGJvdHRvbS1yaWdodC5cbiAgICAgIHNob3dOYXZpZ2F0b3I6IHRoaXMubmF2aWdhdG9yVmlzaWJsZSxcbiAgICAgIC8vIE5lYXJlc3QtbmVpZ2hib3VyIHdoZW4gb2ZmIOKGkiBjcmlzcCBwaXhlbHMgb24gem9vbS1pbiAocGl4ZWwgaW5zcGVjdGlvbikuXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IHRoaXMuc21vb3RoaW5nRW5hYmxlZCxcbiAgICAgIG5hdmlnYXRvclBvc2l0aW9uOiAnQk9UVE9NX1JJR0hUJyxcbiAgICAgIG5hdmlnYXRvclNpemVSYXRpbzogMC4xNixcbiAgICAgIG5hdmlnYXRvckF1dG9GYWRlOiBmYWxzZSxcbiAgICAgIG5hdmlnYXRvckJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLDAuNSknLFxuICAgICAgbG9hZFRpbGVzV2l0aEFqYXg6IHRydWUsXG4gICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiB0cnVlLCAvLyBjb29raWUgYXV0aCAob2F1dGgyLXByb3h5KVxuICAgICAgYWpheEhlYWRlcnM6IHRoaXMuYXV0aEhlYWRlcnMsIC8vIGJlYXJlciBhdXRoIChBdXRoMCksIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjcm9zc09yaWdpblBvbGljeTogJ0Fub255bW91cycsXG4gICAgICAvLyBHZW50bGVyIHpvb206IHRoZSBkZWZhdWx0ICgxLjIpIGZlZWxzIGZhc3QgYW5kIGJpZyBqdW1wcyBjcm9zcyBzZXZlcmFsXG4gICAgICAvLyBweXJhbWlkIGxldmVscyBhdCBvbmNlLCBmaXJpbmcgYSBidXJzdCBvZiB0aWxlIHJlcXVlc3RzLlxuICAgICAgem9vbVBlclNjcm9sbDogMS4xLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIFN3aXRjaCB0byBhIGZpbmVyIHB5cmFtaWQgbGV2ZWwgYXMgc29vbiBhcyB0aGUgY3VycmVudCBvbmUgd291bGQgYmVcbiAgICAgIC8vIHVwc2NhbGVkIGF0IGFsbC4gT1NEJ3MgZGVmYXVsdCAoMC41KSB0b2xlcmF0ZXMgZGlzcGxheWluZyBhIGxldmVsIGF0IHVwXG4gICAgICAvLyB0byAyeCBtYWduaWZpY2F0aW9uIGJlZm9yZSBmZXRjaGluZyB0aGUgbmV4dCwgd2hpY2ggcmVhZHMgYXMgYSBzb2Z0XG4gICAgICAvLyBpbWFnZSB0aGF0IGFicnVwdGx5IHNoYXJwZW5zIHdoZW4gdGhlIHRocmVzaG9sZCBpcyBjcm9zc2VkLiBBdCAxIHRoZVxuICAgICAgLy8gZGlzcGxheWVkIGxldmVsIGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIHRpbGUgcGl4ZWwgcGVyIHNjcmVlbiBwaXhlbCwgc29cbiAgICAgIC8vIHRoZSBvbmx5IHZpc2libGUgcGl4ZWxsYXRpb24gaXMgcGFzdCAxOjEgLSB3aGVyZSB0aGUgYmxvY2tzIGFyZSBnZW51aW5lXG4gICAgICAvLyBzb3VyY2UgcGl4ZWxzIChwYWlyZWQgd2l0aCBpbWFnZVNtb290aGluZ0VuYWJsZWQ9ZmFsc2UpLlxuICAgICAgbWluUGl4ZWxSYXRpbzogMSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBDaHJvbWUgY29tcG9zaXRvciBidWc6IGFmdGVyIGFuIE9TRCB6b29tIHRoZSBkb2NrZWQgdG9vbGJhciAoYSBzaWJsaW5nIG9mXG4gICAgICAgIC8vICNwbG90IGluIHRoZSA8dmlzdWFsaXplcj4gaG9zdCkgaXMgbGVmdCBsYWlkLW91dC1idXQtdW5wYWludGVkIGFuZFxuICAgICAgICAvLyB2YW5pc2hlcyDigJQgY29uZmlybWVkIHZpYSBEZXZUb29scyAoRE9NIGludGFjdCwgcmVnaW9uIHNpbXBseSBub3QgcGFpbnRlZCkuXG4gICAgICAgIC8vIENTUyAoei1pbmRleCAvIGlzb2xhdGlvbiAvIGNvbnRhaW4pIGFuZCBET00tcmVwYXJlbnRpbmcgZG9uJ3QgZml4IGl0OyBhXG4gICAgICAgIC8vIHJlcGFpbnQgcmVsaWFibHkgZG9lcy4gTnVkZ2UgaXQgZWFjaCBhbmltYXRpb24gZnJhbWUgKHNvIGl0IG5ldmVyIHZpc2libHlcbiAgICAgICAgLy8gZHJvcHMpIGFuZCBvbiBzZXR0bGUuIFRoZSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIHdpdGggbm9cbiAgICAgICAgLy8gdmlzaWJsZSBnb25lLWZyYW1lIGFuZCBubyBsYXlvdXQgc2hpZnQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24nLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5udWRnZVRvb2xiYXJSZXBhaW50KCkpO1xuICAgICAgICBpZiAoIXNpbXBsZSkgdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgIC8vIEZvcmNlIGZpdC10by12aWV3IGFzIHRoZSBzcGxpdC9mbGV4IGxheW91dCBzZXR0bGVzLiBBIHRhbGxcbiAgICAgICAgLy8gbm9uLXB5cmFtaWRhbCBpbWFnZSBjYW4gb3RoZXJ3aXNlIG9wZW4gem9vbWVkLWluIChpbWFnZSB3aWR0aCBmaWxsaW5nXG4gICAgICAgIC8vIHRoZSB2aWV3ZXIpLCBtYWtpbmcgT1NEIGRlbWFuZCBzbG93IGZ1bGwtcmVzIHJlcz0wIHRpbGVzIGZvciB0aGVcbiAgICAgICAgLy8gY2VudHJlIGluc3RlYWQgb2YgdGhlIGZhc3QgY29hcnNlIG92ZXJ2aWV3IOKGkiB3aGl0ZSBjYW52YXMuIGdvSG9tZVxuICAgICAgICAvLyBmaXRzIHRoZSB3aG9sZSBpbWFnZSBzbyBPU0Qgc2VsZWN0cyB0aGUgY29hcnNlIHN5bnRoZXRpYyBsZXZlbC4gUmV0cnlcbiAgICAgICAgLy8gYWNyb3NzIGEgZmV3IGZyYW1lcyBiZWNhdXNlIHRoZSBjb250YWluZXIgbWF5IG5vdCBoYXZlIGl0cyBmaW5hbCBzaXplXG4gICAgICAgIC8vIG9uIHRoZSBmaXJzdCBmcmFtZSBhZnRlciAnb3BlbicuXG4gICAgICAgIGNvbnN0IHJlZml0ID0gKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKHRydWUpO1xuICAgICAgICAgICAgLy8gVGhlIG5hdmlnYXRvciB3YXMgc2l6ZWQgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgQkVGT1JFIHRoZVxuICAgICAgICAgICAgLy8gbGF5b3V0IHNldHRsZWQg4oCUIHNvIGl0cyBlbGVtZW50IGNhbiBjYXJyeSBhIHN0YWxlIChldmVuXG4gICAgICAgICAgICAvLyB3cm9uZy1hc3BlY3QpIHNpemUgdGhhdCBmbG9hdHMgdGhlIHZpc2libGUgbWluaW1hcCBhYm92ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcm5lci4gUmUtc2l6ZSBpdCBmcm9tIHRoZSBzZXR0bGVkIGNvbnRhaW5lci5cbiAgICAgICAgICAgIHRoaXMucmVzaXplTmF2aWdhdG9yKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiB0b3JuIGRvd24gKi9cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZpdCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDE1MCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDQwMCk7XG4gICAgICAgIC8vIFRoZSB0aW1lZCByZXRyaWVzIGFib3ZlIG1pc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBTVElMTFxuICAgICAgICAvLyB6ZXJvLXNpemUgYXQgNDAwbXMg4oCUIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgcmVuZGVyIHN0YXJ0cyB3aGlsZSB0aGVcbiAgICAgICAgLy8gZmlsZSB2aWV3ZXIgaXMgbWlkLXN3aXRjaCBmcm9tIHRoZSBmb2xkZXIgdmlldyB0byB0aGUgZGlhZ3JhbSAoZS5nLlxuICAgICAgICAvLyBcIkxvYWQgYXMgU3RhY2tcIiBmcm9tIGEgZm9sZGVyLCB3aXRoIG5vIGltYWdlIG9wZW4gZmlyc3QpLiBCZWNhdXNlXG4gICAgICAgIC8vIHByZXNlcnZlVmlld3BvcnQgc3VwcHJlc3NlcyBPU0QncyBvd24gb3Blbi10aW1lIGZpdCwgdGhlIGltYWdlIHdvdWxkXG4gICAgICAgIC8vIHRoZW4gYmUgbGVmdCB1bi1maXR0ZWQgYXQgdGhlIHRvcC1sZWZ0IChcImEgdGlsZVwiKS4gQSBvbmUtc2hvdFxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBmaXRzIHRoZSBpbnN0YW50IHRoZSBjb250YWluZXIgZmlyc3QgaGFzIGEgcmVhbCBzaXplLFxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHJlbmRlciBiZWdhbiAoaml0LXVpIzEwNikuXG4gICAgICAgIHRoaXMuZml0V2hlbkNvbnRhaW5lclNpemVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpLCByZWZpdCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIG5hdmlnYXRvciBzaXplZCB0byB0aGUgY29udGFpbmVyIGFzIHRoZSBwYW5lbCByZXNpemVzLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVOYXZpZ2F0b3IoKSk7XG4gICAgICAgIGRvbmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gb3Blbi1mYWlsZWQnLCBlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghc2V0dGxlZCkgY29uc29sZS53YXJuKCdbT1NEXSB2aWV3ZXIgb3BlbiB0aW1lZCBvdXQnKTtcbiAgICAgICAgZG9uZShmYWxzZSk7XG4gICAgICB9LCA4MDAwKTtcbiAgICAgIHRoaXMudmlld2VyIS5vcGVuKHRpbGVTb3VyY2UgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXQtdG8taG9tZSBvbmNlIGBlbGAgZmlyc3QgaGFzIGEgbm9uLXplcm8gc2l6ZS4gSWYgaXQncyBhbHJlYWR5IHNpemVkIHdlXG4gICAqIHJlbHkgb24gdGhlIHRpbWVkIHJlZml0cyB0aGUgY2FsbGVyIHNjaGVkdWxlZDsgb3RoZXJ3aXNlIGEgb25lLXNob3RcbiAgICogUmVzaXplT2JzZXJ2ZXIgcnVucyBgcmVmaXRgIHRoZSBtb21lbnQgdGhlIGNvbnRhaW5lciBpcyBsYWlkIG91dCAodGhlblxuICAgKiBkaXNjb25uZWN0cyksIHNvIHRoZSBpbml0aWFsIGZpdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgcmVuZGVyJ3Mgc3RhcnQgdGltZVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZGlhZ3JhbSBjb250YWluZXIncyBsYXlvdXQuIE5vLW9wIHdpdGhvdXQgYSBjb250YWluZXIgb3JcbiAgICogUmVzaXplT2JzZXJ2ZXIgKHRoZSB0aW1lZCByZWZpdHMgcmVtYWluIHRoZSBmYWxsYmFjaykuIE9uZS1zaG90ICsgb25seVxuICAgKiBhdHRhY2hlZCBvbiBhIGZyZXNoIG1vdW50LCBzbyBzbGljZS1zY3J1YiByZS1vcGVucyBrZWVwIHRoZSB1c2VyJ3Mgem9vbS5cbiAgICovXG4gIHByaXZhdGUgZml0V2hlbkNvbnRhaW5lclNpemVkKGVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJlZml0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKCFlbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSByZXR1cm47IC8vIGFscmVhZHkgc2l6ZWQg4oCUIHRpbWVkIHJlZml0cyBzdWZmaWNlXG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgIHJvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVmaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByby5vYnNlcnZlKGVsKTtcbiAgICAvLyBTYWZldHkgbmV0OiBzdG9wIG9ic2VydmluZyBldmVuIGlmIGl0IG5ldmVyIGdhaW5zIGEgc2l6ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHJvLmRpc2Nvbm5lY3QoKSwgNTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIHRpbGUgc291cmNlIGJ1aWx0IGZyb20gdGhlIGRlc2NyaXB0b3IuIE9TRCBudW1iZXJzIGxldmVsc1xuICAgKiBjb2Fyc2VzdC1maXJzdDsgdGhlIGJhY2tlbmQgbnVtYmVycyByZXNvbHV0aW9ucyBmdWxsLXJlcy1maXJzdCwgc29cbiAgICogYHJlcyA9IChsZXZlbHMtMSkgLSBvc2RMZXZlbGAuIE92ZXJyaWRpbmcgZ2V0TGV2ZWxTY2FsZS9nZXROdW1UaWxlcyBsZXRzIHVzXG4gICAqIGhvbm91ciBCaW8tRm9ybWF0cycgYWN0dWFsIHBlci1sZXZlbCBkaW1lbnNpb25zIChub3QgYXNzdW1lIHBvd2VyLW9mLXR3bykuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZVNvdXJjZShkOiBUaWxlRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpOiBhbnkge1xuICAgIC8vIE11bHRpY2hhbm5lbCBpbWFnZXMgY29tcG9zaXRlIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMsIHdoaWNoIG9ubHkgZXhpc3QgYXRcbiAgICAvLyByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb25zIOKAlCBzbyBkcml2ZSBPU0Qgb2ZmIHRoZSByZWFsIGxldmVscyBhbG9uZSBhbmRcbiAgICAvLyBza2lwIHRoZSBzeW50aGV0aWMgKHNlcnZlci1jb21wb3NpdGVkKSBvdmVydmlld3MuIEV2ZXJ5IGRpc3BsYXllZCB0aWxlIGlzXG4gICAgLy8gdGhlbiBwZXItY2hhbm5lbC1mZXRjaGFibGUgYXQgYW55IHpvb20uXG4gICAgY29uc3QgbGV2ZWxzID0gdGhpcy5pc011bHRpQ2hhbm5lbCA/IGQubGV2ZWxzLnNsaWNlKDAsIHRoaXMucmVhbExldmVscykgOiBkLmxldmVscztcbiAgICBjb25zdCBuID0gbGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5hcGk7XG5cbiAgICAvLyBPU0QgbGV2ZWwgaSAoMCA9IGNvYXJzZXN0KSA8LT4gYmFja2VuZCByZXNvbHV0aW9uIChuLTEtaSkgKHJlcyAwID0gZnVsbCkuXG4gICAgLy8gVGhlIGJhY2tlbmQgcHlyYW1pZCBpcyBOT1QgbmVjZXNzYXJpbHkgcG93ZXItb2YtdHdvLCBzbyB3ZSBkcml2ZSBPU0Qgb2ZmXG4gICAgLy8gdGhlIGJhY2tlbmQncyByZWFsIHBlci1sZXZlbCBkaW1lbnNpb25zLiBXZSBvdmVycmlkZSBPTkxZIGdldExldmVsU2NhbGU6XG4gICAgLy8gT1NEIGRlcml2ZXMgZ2V0TnVtVGlsZXMsIGdldFRpbGVCb3VuZHMgQU5EIGl0cyBwZXItem9vbSBsZXZlbCBzZWxlY3Rpb25cbiAgICAvLyBmcm9tIGdldExldmVsU2NhbGUsIHNvIHRoZXkgYWxsIHN0YXkgY29uc2lzdGVudCDigJQgcmVxdWVzdGluZyBleGFjdGx5IHRoZVxuICAgIC8vIHRpbGVzIGVhY2ggcmVzb2x1dGlvbiBhY3R1YWxseSBoYXMgKG5vIG91dC1vZi1yYW5nZSA0MDBzLCBubyBmbG9vZCkuXG4gICAgY29uc3QgcmVzRm9yTGV2ZWwgPSAobGV2ZWw6IG51bWJlcikgPT4gbiAtIDEgLSBsZXZlbDtcbiAgICBjb25zdCB0czogYW55ID0gbmV3IChPU0QgYXMgYW55KS5UaWxlU291cmNlKHtcbiAgICAgIHdpZHRoOiBkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkLmhlaWdodCxcbiAgICAgIHRpbGVTaXplOiB0LFxuICAgICAgdGlsZU92ZXJsYXA6IDAsXG4gICAgICBtaW5MZXZlbDogMCxcbiAgICAgIG1heExldmVsOiBuIC0gMSxcbiAgICB9KTtcbiAgICB0cy5nZXRMZXZlbFNjYWxlID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgcmV0dXJuIGx2bCA/IGx2bC53aWR0aCAvIGQud2lkdGggOiAxO1xuICAgIH07XG4gICAgLy8gRHJpdmUgdGhlIHRpbGUgQ09VTlQgb2ZmIGVhY2ggbGV2ZWwncyBvd24gKGluZGVwZW5kZW50bHktcm91bmRlZCkgZGltZW5zaW9ucyxcbiAgICAvLyBub3QgT1NEJ3MgZGVmYXVsdCBgY2VpbChzY2FsZSAqIGZ1bGxEaW1lbnNpb24gLyB0aWxlU2l6ZSlgLiBTeW50aGV0aWMgQU5EIHJlYWxcbiAgICAvLyBCaW8tRm9ybWF0cyBsZXZlbHMgYXJlbid0IGV4YWN0IHByb3BvcnRpb25hbCBzY2FsZXMgb2YgdGhlIGZ1bGwgaW1hZ2UsIHNvXG4gICAgLy8gYHNjYWxlICogZnVsbEhlaWdodGAgY2FuIHJvdW5kIHVwIHRvIG9uZSBtb3JlIHJvdyAob3IgY29sdW1uKSB0aGFuIHRoZSBsZXZlbFxuICAgIC8vIGFjdHVhbGx5IGhhcyDigJQgT1NEIHRoZW4gcmVxdWVzdHMgYW4gb3V0LW9mLXJhbmdlIHRpbGUgdGhhdCB0aGUgc2VydmVyIDQwMHNcbiAgICAvLyAoXCJUaWxlIChjb2wscm93KSBvdXQgb2YgcmFuZ2VcIikuIFVzaW5nIHRoZSBsZXZlbCdzIHJlYWwgdy9oIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VydmVyJ3Mgb3duIGJvdW5kcyBjaGVjayBleGFjdGx5LlxuICAgIGNvbnN0IFBvaW50ID0gKE9TRCBhcyBhbnkpLlBvaW50O1xuICAgIHRzLmdldE51bVRpbGVzID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgaWYgKCFsdmwpIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICByZXR1cm4gbmV3IFBvaW50KE1hdGguY2VpbChsdmwud2lkdGggLyB0KSwgTWF0aC5jZWlsKGx2bC5oZWlnaHQgLyB0KSk7XG4gICAgfTtcbiAgICB0cy5nZXRUaWxlVXJsID0gKGxldmVsOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgICAgYnVpbGRUaWxlVXJsKGJhc2UsIGluZm9CNjQsIHsgcmVzOiByZXNGb3JMZXZlbChsZXZlbCksIGNvbDogeCwgcm93OiB5LCB6LCB0aWxlU2l6ZTogdCwgY2hhbm5lbCB9KTtcbiAgICByZXR1cm4gdHM7XG4gIH1cblxuICAvKiogUmUtYXBwbHkgdGhlIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9jb2xvdXIvaW52ZXJ0KSBhZnRlciBhIHN0YXRlIGNoYW5nZS5cbiAgICogIE11bHRpY2hhbm5lbCBpbnZhbGlkYXRlcyBPTkxZIHRoZSB2aXNpYmxlIHNsaWNlJ3MgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZ1xuICAgKiAgdGhlIHdob2xlIHdvcmxkIHdvdWxkIHJlLXByb2Nlc3MgZXZlcnkgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksXG4gICAqICBmbG9vZGluZyBPU0Qgd2l0aCBcIltDYWNoZVJlY29yZF0g4oCmIEludmFsaWRTdGF0ZUVycm9yXCIgYW5kIHdhc3Rpbmcgd29yayBvbiB0aWxlc1xuICAgKiAgdGhhdCBhcmVuJ3Qgb24gc2NyZWVuLiBUaGUgb3RoZXIgY2FjaGVkIHNsaWNlcyBhcmUgbWFya2VkIHN0YWxlIGFuZCByZS10aW50ZWRcbiAgICogIGxhemlseSB3aGVuIHJldmVhbGVkLiBDb21wb3NpdGUvZ3JheXNjYWxlIGludmFsaWRhdGUgdGhlIHdvcmxkIGFzIGJlZm9yZS4gKi9cbiAgLyoqIENvbGxhcHNlIGEgYnVyc3Qgb2YgZGlzcGxheS1zdGF0ZSBjaGFuZ2VzIGludG8gT05FIGludmFsaWRhdGlvbiBvbiB0aGUgbmV4dFxuICAgKiAgZnJhbWUuIERyYWdnaW5nIGEgd2luZG93IHNsaWRlciBlbWl0cyBwZXIgcGl4ZWwgb2YgdHJhdmVsLCBhbmQgZWFjaCByb3VuZFxuICAgKiAgcmVzdG9yZXMgYW5kIHJlLXByb2Nlc3NlcyBldmVyeSB0aWxlIG9mIGV2ZXJ5IGNoYW5uZWwg4oCUIHNvIHRoZSBidXJzdCBpcyBib3RoXG4gICAqICB3YXN0ZWQgd29yayBhbmQgdGhlIHJhY2UgdGhhdCBicmVha3MgY2FjaGUgcmVjb3JkcyAoc2VlIHtAbGluayBkaXNwbGF5VG9rZW59KS5cbiAgICogIFRoZSBzdG9yZSB3cml0ZSBzdGF5cyBsaXZlLCBzbyB0aGUgcGFuZSBpdHNlbGYgcmVtYWlucyByZXNwb25zaXZlLiAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgcXVldWVkIGZvciB0aGlzIGZyYW1lXG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgICB0aGlzLmludmFsaWRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVEaXNwbGF5KCk6IHZvaWQge1xuICAgIC8vIFN1cGVyc2VkZSBhbnkgaW4tZmxpZ2h0IHJlY29sb3Igcm91bmQgYmVmb3JlIHJlc3RhcnRpbmcgb25lIChzZWUgZGlzcGxheVRva2VuKS5cbiAgICB0aGlzLmRpc3BsYXlUb2tlbisrO1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLmNhY2hlLmludmFsaWRhdGVDaGFubmVsRGlzcGxheSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHsgdi53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTsgfSBjYXRjaCB7IC8qIG5vLW9wICovIH1cbiAgICB0cnkgeyB2Lm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Vmlld2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdmlld3BvcnQgbm90IHJlYWR5ICovXG4gICAgfVxuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgcGFpbnRzIGluc3RlYWQgb2YgcGFubmluZy5cbiAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTtcbiAgICAvLyBUaGUgYnJ1c2ggd29ya3MgaW4gdGhlIHJlbmRlcmVkLXZpZXdwb3J0IGNvb3JkaW5hdGUgZnJhbWUg4oCUIHJlYWQgaXQgYmFja1xuICAgIC8vIGxhemlseSBvbiBmaXJzdCB1c2UsIGxpa2UgdGhlIHdhbmQuIEl0IHNoYXJlcyB0aGUgd2FuZCdzIGhvc3QuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZSgob3B0aW9ucyBhcyBCcnVzaE9wdGlvbnMpPy5zaXplID8/IDApO1xuICB9XG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRvb2wgdGFrZXMgdGhlIHBvaW50ZXJcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRoZSBib3ggZHJhZyBtdXN0IG5vdCBwYW5cbiAgICAgIHRoaXMuem9vbVRvQm94VG9vbC5iaW5kSG9zdCh0aGlzLnpvb21Cb3hIb3N0KCkpO1xuICAgIH1cbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICAgIGlmICghYWN0aXZlKSB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKHRydWUpO1xuICB9XG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNOiBzZWdtZW50IHRoZSBkcmF3biByZWN0YW5nbGVzLiBUaGUgU0FNIHRvb2wgcmV1c2VzIHRoZVxuICAgKiAgd2FuZCBob3N0ICh2aWV3cG9ydCByZWFkYmFjayArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gc2VnbWVudCBhZ2FpbnN0IHRoZSBjdXJyZW50IHZpZXdwb3J0IHJlYWRiYWNrXG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy5jZWxsU2VnbWVudGVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDApO1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBjcm9wIGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9vbC5zZXRNb2RlbChpZCk7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZWwoaWQpO1xuICB9XG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gY2xpY2tzIGFkZCBwb2ludHMsIGRvbid0IHBhblxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7IH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKiogQnVpbGQgdGhlIHdhbmQvZXJhc2VyIGhvc3Qgb2JqZWN0cyBib3VuZCB0byB0aGlzIGJhY2tlbmQuIEJvdGggdG9vbHMgcnVuXG4gICAqICBvdmVyIE9TRCB2aWEgdGhlIHNoYXJlZCBjb29yZGluYXRlIHRyYW5zZm9ybSArIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2ssXG4gICAqICBhbmQgcmVhZC93cml0ZSByZWdpb25zIGRpcmVjdGx5IG9uIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgKG5ldXRyYWwgbW9kZWwpLiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5jdXJyZW50WixcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmN1cnJlbnRGaWxlTmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldENhY2hlZEltYWdlUmF0aW86ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBlbGVtZW50IHRoZSBvbi1jYW52YXMgdG9vbCBvdmVybGF5cyBhdHRhY2ggdG8gKE9TRCBpcyBtb3VudGVkIGhlcmUpLiAqL1xuICBwcml2YXRlIGdldE92ZXJsYXlDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gIH1cblxuICAvKiogU2l6ZSB0aGUgbmF2aWdhdG9yIGZyb20gdGhlIENVUlJFTlQgY29udGFpbmVyIChuYXZpZ2F0b3JTaXplUmF0aW8gb2YgdGhlXG4gICAqICB2aWV3ZXIgZWxlbWVudCkgYW5kIGtlZXAgaXQgcGlubmVkIHRvIHRoZSBjb3JuZXIuIE9TRCBjb21wdXRlcyB0aGUgc2l6ZVxuICAgKiAgb25jZSBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBiZWZvcmUgdGhlIGhvc3QgZmxleCBsYXlvdXQgc2V0dGxlcyDigJRcbiAgICogIGFuZCBuZXZlciBjb3JyZWN0cyBpdCwgbGVhdmluZyBhIHN0YWxlLXNpemUgZWxlbWVudCB3aG9zZSB2aXNpYmxlIG1pbmltYXBcbiAgICogIGZsb2F0cyBhYm92ZSB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lci4gKi9cbiAgcHJpdmF0ZSByZXNpemVOYXZpZ2F0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3QgbmF2ID0gdj8ubmF2aWdhdG9yO1xuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHY/LmVsZW1lbnQ7XG4gICAgaWYgKCFuYXY/LmVsZW1lbnQgfHwgIWVsPy5jbGllbnRXaWR0aCB8fCAhZWw/LmNsaWVudEhlaWdodCkgcmV0dXJuO1xuICAgIGNvbnN0IHcgPSBNYXRoLnJvdW5kKGVsLmNsaWVudFdpZHRoICogMC4xNik7XG4gICAgY29uc3QgaCA9IE1hdGgucm91bmQoZWwuY2xpZW50SGVpZ2h0ICogMC4xNik7XG4gICAgaWYgKG5hdi5lbGVtZW50LnN0eWxlLndpZHRoICE9PSBgJHt3fXB4YCB8fCBuYXYuZWxlbWVudC5zdHlsZS5oZWlnaHQgIT09IGAke2h9cHhgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuYXYuc2V0V2lkdGgodyk7XG4gICAgICAgIG5hdi5zZXRIZWlnaHQoaCk7XG4gICAgICB9IGNhdGNoIHsgLyogbmF2aWdhdG9yIHRvcm4gZG93biAqLyB9XG4gICAgfVxuICAgIC8vIE5vcm1hbGl6ZSBPU0QncyBjb250cm9sLWNvcm5lciBzdGFjayBzbyB0aGUgbWluaW1hcCBzaXRzIGZsdXNoIGluIHRoZVxuICAgIC8vIGNvcm5lciwgaW5zZXQgMTJweCB0byBsaW5lIHVwIHdpdGggdGhlIHNjYWxlIGJhcjpcbiAgICAvLyAgLSB0aGUgaW5saW5lLWJsb2NrIHdyYXBwZXIgY2FycmllcyBsaW5lLWJveCBzdHJ1dHMgYW5kIGNhbiByZXRhaW4gc3RhbGVcbiAgICAvLyAgICBzaXppbmcg4oaSIG1ha2UgaXQgYSB0aWdodCBibG9jaztcbiAgICAvLyAgLSBhbnl0aGluZyBlbHNlIE9TRCBsZWZ0IGluIHRoZSBjb3JuZXIgd291bGQgc3RhY2sgYmVsb3cgdGhlIG5hdmlnYXRvclxuICAgIC8vICAgIGFuZCBmbG9hdCBpdCB1cCDihpIgaGlkZSBpdDtcbiAgICAvLyAgLSBpbnNldCB0aGUgY29ybmVyIGl0c2VsZiAoYm90dG9tL3JpZ2h0IDEycHgpLCBrZWVwaW5nIHRoZSBlbGVtZW50IGluXG4gICAgLy8gICAgbm9ybWFsIGZsb3cuXG4gICAgY29uc3Qgd3JhcHBlciA9IG5hdi5lbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGNvcm5lciA9IHdyYXBwZXI/LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh3cmFwcGVyICYmIGNvcm5lcikge1xuICAgICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHdyYXBwZXIuc3R5bGUubGluZUhlaWdodCA9ICcwJztcbiAgICAgIHdyYXBwZXIuc3R5bGUuZm9udFNpemUgPSAnMCc7XG4gICAgICAvLyBUaGUgd3JhcHBlciBrZWVwcyB0aGUgbmF2aWdhdG9yJ3Mgc3RhbGUgcHJlLXNldHRsZSBoZWlnaHQgYXMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IHNpemUgKHRoZSBuYXYgd2FzIDAuMTZ4IHRoZSBVTlNFVFRMRUQgY29udGFpbmVyIGF0IGNyZWF0aW9uKSxcbiAgICAgIC8vIGxlYXZpbmcgYW4gZW1wdHkgYmFuZCB1bmRlciB0aGUgcmVzaXplZCBtaW5pbWFwIOKAlCBtZWFzdXJlZCBsaXZlOlxuICAgICAgLy8gbmF2SD04NyBpbnNpZGUgd3JhcEg9MTY3LiBGb3JjZSBpdCB0byBodWcgaXRzIGNvbnRlbnQuXG4gICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSAnYXV0byc7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20oY29ybmVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gd3JhcHBlcikgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbSh3cmFwcGVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbmF2LmVsZW1lbnQpIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBjb3JuZXIuc3R5bGUuYm90dG9tID0gJzEycHgnO1xuICAgICAgY29ybmVyLnN0eWxlLnJpZ2h0ID0gJzEycHgnO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG5hdi5lbGVtZW50LnN0eWxlLCB7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB0b3A6ICcnLCBsZWZ0OiAnJywgYm90dG9tOiAnJywgcmlnaHQ6ICcnLCBtYXJnaW46ICcwJyB9KTtcbiAgICAvLyBUT0RPKGRlYnVnKTogcmVtb3ZlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IG5lciA9IG5hdi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyID0gd3JhcHBlcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY3IgPSBjb3JuZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBlciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnNvbGUud2FybihgW3ZpejpuYXZdIG5hdkJvdHRvbT0ke01hdGgucm91bmQobmVyLmJvdHRvbSl9IHdyYXBCb3R0b209JHtNYXRoLnJvdW5kKHdyPy5ib3R0b20gPz8gLTEpfSBgICtcbiAgICAgIGBjb3JuZXJCb3R0b209JHtNYXRoLnJvdW5kKGNyPy5ib3R0b20gPz8gLTEpfSBwbG90Qm90dG9tPSR7TWF0aC5yb3VuZChwZXIuYm90dG9tKX0gYCArXG4gICAgICBgbmF2SD0ke01hdGgucm91bmQobmVyLmhlaWdodCl9IHdyYXBIPSR7TWF0aC5yb3VuZCh3cj8uaGVpZ2h0ID8/IC0xKX0gY29ybmVySD0ke01hdGgucm91bmQoY3I/LmhlaWdodCA/PyAtMSl9YCk7XG4gIH1cblxuICAvKiogRm9yY2UgdGhlIGRvY2tlZCB0b29sYmFyIHRvIHJlcGFpbnQgYWZ0ZXIgYW4gT1NEIHpvb20uIENocm9tZSBsZWF2ZXMgaXRcbiAgICogIGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgKHRoZSBjYW52YXMncyBjb21wb3NpdGluZyBjaHVybiBzdHJhbmRzIHRoZSB0b29sYmFyJ3NcbiAgICogIHJhc3RlcikuIEEgc3luY2hyb25vdXMgZGlzcGxheSB0b2dnbGUgcmUtcmFzdGVycyBpdCB3aXRoIG5vIHZpc2libGUgZ29uZS1mcmFtZVxuICAgKiAgYW5kIG5vIGxheW91dCBzaGlmdC4gTG9jYXRlZCB2aWEgdGhlIERPTSBzaW5jZSB0aGlzIHNlcnZpY2UgZG9lc24ndCBvd24gdGhlXG4gICAqICB0b29sYmFyOyBhIG5vLW9wIHdoZW4gdGhlcmUncyBubyB0b29sYmFyIChlLmcuIGVtYmVkZGVkIHdpdGhvdXQgb25lKS4gKi9cbiAgcHJpdmF0ZSBudWRnZVRvb2xiYXJSZXBhaW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHBsb3RFbCA9IHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICAgIGNvbnN0IGRvY2sgPSBwbG90RWw/LmNsb3Nlc3QoJ3Zpc3VhbGl6YXRpb24nKT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy50b29sYmFyLWRvY2snKTtcbiAgICBpZiAoIWRvY2spIHJldHVybjtcbiAgICBjb25zdCBwcmV2ID0gZG9jay5zdHlsZS5kaXNwbGF5O1xuICAgIGRvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB2b2lkIGRvY2sub2Zmc2V0SGVpZ2h0OyAvLyByZWZsb3cgc28gdGhlIHRvZ2dsZSByZS1yYXN0ZXJzIG9uIHRoZSBuZXh0IHBhaW50XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gcHJldjtcbiAgfVxuXG4gIC8qKiBIb3N0IGZvciB0aGUgKHNoYXJlZCkgem9vbS10by1ib3ggdG9vbDogY29udmVydCBvdmVybGF5IHBpeGVscyB0byBpbWFnZVxuICAgKiAgY29vcmRzIHZpYSB0aGUgdmlld3BvcnQsIGFuZCBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBjaG9zZW4gcmVjdGFuZ2xlLiAqL1xuICBwcml2YXRlIHpvb21Cb3hIb3N0KCk6IFpvb21Ub0JveFRvb2xIb3N0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweDogbnVtYmVyLCBweTogbnVtYmVyKSA9PiBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgcHgsIHB5KSxcbiAgICAgIGFwcGx5Wm9vbVRvQm94OiAoY29vcmRzOiBudW1iZXJbXSkgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogRml0IHRoZSBPU0Qgdmlld3BvcnQgdG8gYW4gaW1hZ2Utc3BhY2UgcmVjdGFuZ2xlIChjb29yZHMgb3JkZXJlZFxuICAgKiAgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dKS4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8IGNvb3JkaW5hdGVzLmxlbmd0aCA8IDQpIHJldHVybjtcbiAgICBjb25zdCBbYSwgYiwgYywgZF0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4ID0gTWF0aC5taW4oYSwgYik7XG4gICAgY29uc3QgdyA9IE1hdGguYWJzKGIgLSBhKTtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oYywgZCk7XG4gICAgY29uc3QgaCA9IE1hdGguYWJzKGMgLSBkKTtcbiAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBpbWFnZVJlY3RUb1ZpZXdwb3J0KHRoaXMudmlld2VyLCB4LCB5LCB3LCBoKTtcbiAgICB0aGlzLnZpZXdlci52aWV3cG9ydC5maXRCb3VuZHMocmVjdCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYmFjayB0aGUgKmN1cnJlbnRseSByZW5kZXJlZCogT1NEIGNhbnZhcyBhcyB0aGUgd2FuZCdzIHBpeGVsIG1hdHJpeC5cbiAgICogVGhlIG1hdHJpeCBjb3ZlcnMgb25seSB0aGUgdmlzaWJsZSB2aWV3cG9ydCBhdCBzY3JlZW4gcmVzb2x1dGlvbiwgc28gd2hlblxuICAgKiB0aGUgdXNlciBpcyB6b29tZWQgaW50byBhIHN1Yi1yZWdpb24gdGhlIHdhbmQgc2FtcGxlcyB0aGF0IHJlZ2lvbidzIGRldGFpbFxuICAgKiAocmF0aGVyIHRoYW4gdGhlIHdob2xlIGltYWdlIGF0IHByZXZpZXcgcmVzb2x1dGlvbikuIGBvcmlnaW5YL29yaWdpbllgIGFuZFxuICAgKiBgcmF0aW9zYCBtYXAgaW1hZ2UgY29vcmRzIDwtPiByZWFkYmFjay1waXhlbCBjb29yZHMgZm9yIHRoZSB3YW5kJ3NcbiAgICogZGF0YS9yYXRpby9vcmlnaW4gbW9kZWwuIENhY2hlZCB1bnRpbCB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZGJhY2tWaWV3cG9ydCgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFBpeGVscykgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXIgYXMgYW55O1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSB2aWV3ZXI/LmRyYXdlcj8uY2FudmFzO1xuICAgIGNvbnN0IHZwID0gdmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0IHx8ICF2cCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aDsgLy8gZGV2aWNlIHBpeGVsc1xuICAgIGNvbnN0IGggPSBjYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7IC8vIFJHQkEsIHJvdy1tYWpvclxuICAgIC8vIEJ1aWxkIHRoZSBbeV1beF0gPSBbcixnLGJdIG1hdHJpeCB0aGUgd2FuZCBleHBlY3RzIGZvciBSR0IgZnJhbWVzLlxuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuXG4gICAgLy8gSW1hZ2UtY29vcmQgc3BhbiB0aGUgcmVhZGJhY2sgY292ZXJzIChDU1MgcHggaW4sIGltYWdlIGNvb3JkcyBvdXQpLiBSb3V0ZVxuICAgIC8vIHRocm91Z2ggd29ybGQgaXRlbSAwIChvc2QtY29vcmRzKSBzbyBpdCBzdGF5cyBhY2N1cmF0ZSDigJQgYW5kIHF1aWV0IOKAlCB3aGVuXG4gICAgLy8gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWwgbXVsdGljaGFubmVsIGxheWVycykuXG4gICAgY29uc3QgZWxXID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgZWxIID0gY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIGNvbnN0IHRsID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIDAsIDApO1xuICAgIGNvbnN0IGJyID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIGVsVywgZWxIKTtcbiAgICBjb25zdCByYXRpb1ggPSAoYnIueCAtIHRsLngpIC8gdzsgLy8gaW1hZ2UgcHggcGVyIHJlYWRiYWNrIHB4XG4gICAgY29uc3QgcmF0aW9ZID0gKGJyLnkgLSB0bC55KSAvIGg7XG5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0ge1xuICAgICAgZnJhbWVzOiBbbWF0cml4XSxcbiAgICAgIHdpZHRoOiB3LFxuICAgICAgaGVpZ2h0OiBoLFxuICAgICAgcmF0aW9zOiBbcmF0aW9YLCByYXRpb1ldLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLCAvLyBjYW52YXMgcmVhZGJhY2sgaXMgYWx3YXlzIFJHQkFcbiAgICAgIG9yaWdpblg6IHRsLngsXG4gICAgICBvcmlnaW5ZOiB0bC55LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gIH1cblxuICAvKipcbiAgICogUmVjb2xvciBhIGdyYXlzY2FsZSB0aWxlIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBMVVQsIHVzaW5nIE9TRCdzXG4gICAqIHRpbGUtaW52YWxpZGF0ZWQgcGl4ZWwgcGlwZWxpbmUgKE9TRCA1Ky82KS4gTWFwcyBlYWNoIHBpeGVsJ3MgZ3JheXNjYWxlXG4gICAqIHZhbHVlIChyPT1nPT1iKSB0byB0aGUgTFVUJ3MgUkdCLiBOby1vcCBmb3IgUkdCIGltYWdlcyBvciB1bnRpbCB0aGUgTFVUIGlzXG4gICAqIGJ1aWx0LiBIYW5kbGVyIGlzIGFzeW5jIOKAlCBPU0QgYXdhaXRzIGl0IChyYWlzZUV2ZW50QXdhaXRpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVjb2xvckNoYW5uZWxUaWxlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCBncmF5ID0gdGhpcy5pc0dyYXlzY2FsZUltYWdlO1xuICAgIGlmIChncmF5KSB7XG4gICAgICBpZiAoIXRoaXMuY29sb3JMdXQpIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc3BsYXkucmdiTmVlZHNSZWNvbG9yKCkpIHtcbiAgICAgIHJldHVybjsgLy8gUkdCIGF0IGRlZmF1bHQgKGFsbCB2aXNpYmxlLCBmdWxsIHdpbmRvdywgzrM9MSwgbm8gaW52ZXJ0KSDihpIgcGFzc3Rocm91Z2hcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSB0aWxlJ3MgcGl4ZWxzLiBQcmVmZXIgdGhlIHJlbmRlcmluZyBjb250ZXh0LCBidXQgc29tZSB0aWxlIGNhY2hlc1xuICAgIC8vIChhamF4IFBORyBibG9icykgY29udmVydCB0byBhbiAqZW1wdHkqIGNvbnRleHQyZCDigJQgcmVjb2xvcmluZyB0aGF0IHdvdWxkXG4gICAgLy8gYmxhbmsgdGhlIHRpbGUgKHdoaXRlIGNhbnZhcykuIFNvIGlmIHRoZSBjb250ZXh0IGhhcyBubyBvcGFxdWUgcGl4ZWxzLCBkcmF3XG4gICAgLy8gdGhlIHRpbGUncyBvd24gYml0bWFwL2ltYWdlIGFuZCByZWNvbG9yIHRoYXQgaW5zdGVhZC4gV2UgbmV2ZXIgd3JpdGUgYmFja1xuICAgIC8vIHVubGVzcyB3ZSBhY3R1YWxseSByZWNvbG9yZWQgc29tZXRoaW5nLCBzbyBhIHRpbGUgaXMgbmV2ZXIgYmxhbmtlZC5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY3R4ID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnY29udGV4dDJkJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB0cnkgYml0bWFwIGJlbG93ICovXG4gICAgfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpbWcgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWltZyB8fCAhdGhpcy5oYXNPcGFxdWUoaW1nLmRhdGEpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHRpbGUncyBkZWNvZGVkIGltYWdlL2JpdG1hcC5cbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vbmUgKi9cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiBub25lICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHJldHVybjsgLy8gY2FuJ3QgZ2V0IHBpeGVscyDigJQgbGVhdmUgdGhlIHRpbGUgdW50b3VjaGVkXG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoO1xuICAgICAgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltZy5kYXRhKSB8fCAhY3R4KSByZXR1cm47IC8vIG5vdGhpbmcgb3BhcXVlXG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kIGhhcyBhbHJlYWR5IHJlc3RvcmVkIHRoaXMgdGlsZSDigJQgd3JpdGluZyBub3cgd291bGRcbiAgICAvLyBoYW5kIE9TRCBhIHN1cGVyc2VkZWQgY2FudmFzIGFuZCBkZXN0cm95IHRoZSBjYWNoZSByZWNvcmQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBUaGUgdGlsZSdzIGNhY2hlIGNhbiBzdGlsbCBiZSBldmljdGVkIGJldHdlZW4gdGhlIGF3YWl0cyBhYm92ZSBhbmQgaGVyZSAoYVxuICAgIC8vIHNsaWNlIGNoYW5nZSksIG1ha2luZyBzZXREYXRhIHRocm93IGEgRE9NRXhjZXB0aW9uIG9uIGEgZGVhZCBjYW52YXMuXG4gICAgLy8gU3dhbGxvdyBpdCDigJQgdGhlIHRpbGUgaXMgZ29uZSwgc28gdGhlcmUncyBub3RoaW5nIHRvIHJlY29sb3IuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKipcbiAgICogVGludCBhIHNpbmdsZSBjaGFubmVsJ3MgdGlsZSBpbiBwbGFjZS4gRWFjaCBjaGFubmVsIGlzIGl0cyBvd24gT3BlblNlYWRyYWdvblxuICAgKiBUaWxlZEltYWdlIChhIHNpbmdsZS1iYW5kIGdyYXlzY2FsZSB0aWxlKTsgT1NEIGNvbXBvc2l0ZXMgdGhlIE4gaW1hZ2VzXG4gICAqIGFkZGl0aXZlbHkgKCdsaWdodGVyJykgaW4gaXRzIGRyYXdlciDigJQgc28gdGhpcyBqdXN0IG1hcHMgdGhlIHRpbGUncyBpbnRlbnNpdHlcbiAgICogdGhyb3VnaCB0aGUgY2hhbm5lbCdzIHdpbmRvdy9nYW1tYSBhbmQgaXRzIHBzZXVkby1jb2xvdXIuIFN5bmNocm9ub3VzIChub1xuICAgKiBjcm9zcy10aWxlIGZldGNoKSDihpIgbm8gcmFjZSwgbm8gc2VhbXMuIENoYW5uZWwgaXMgcGFyc2VkIGZyb20gdGhlIHRpbGUgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5kaXNwbGF5VG9rZW47XG4gICAgY29uc3QgdGlsZSA9IGV2ZW50Py50aWxlO1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gKHRpbGUgJiYgKHR5cGVvZiB0aWxlLmdldFVybCA9PT0gJ2Z1bmN0aW9uJyA/IHRpbGUuZ2V0VXJsKCkgOiB0aWxlLnVybCkpIHx8ICcnO1xuICAgIGNvbnN0IG0gPSAvWz8mXWNoYW5uZWw9KFxcZCspLy5leGVjKHVybCk7XG4gICAgY29uc3QgY2ggPSBtID8gcGFyc2VJbnQobVsxXSwgMTApIDogMDtcbiAgICBjb25zdCBzdCA9IHRoaXMuY2hhbm5lbFN0YXRlc1tjaF07XG5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkgeyBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIGZhbGxiYWNrIGJlbG93ICovIH1cbiAgICBsZXQgaW1nOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3R4ICYmIGN0eC5jYW52YXMgJiYgY3R4LmNhbnZhcy53aWR0aCAmJiBjdHguY2FudmFzLmhlaWdodCkge1xuICAgICAgdHJ5IHsgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7IH0gY2F0Y2ggeyBpbWcgPSBudWxsOyB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkgeyBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpOyB9IGNhdGNoIHsgLyogbm9uZSAqLyB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSB7IHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH0gfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuO1xuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHNyYy53aWR0aDsgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuXG4gICAgLy8gUHJlY29tcHV0ZSBsdW0oMC4uMjU1KSDihpIgdGludGVkIFJHQiBvbmNlLCB0aGVuIG1hcCBlYWNoIHBpeGVsIGJ5IGxvb2t1cCDigJRcbiAgICAvLyB0aGUgY2hhbm5lbCB0aWxlIGlzIHNpbmdsZS1iYW5kLCBzbyB0aGlzIHR1cm5zIH4yNjJrIHBlci1waXhlbFxuICAgIC8vIGNoYW5uZWxJbnRlbnNpdHkoKSAod2l0aCBNYXRoLnBvdyBmb3IgZ2FtbWEpIGNhbGxzIGludG8gMjU2IOKAlCB0aGUgZGlmZmVyZW5jZVxuICAgIC8vIGJldHdlZW4gYSBzbmFwcHkgYW5kIGEgc2x1Z2dpc2ggc2xpZGVyIG9uIGEgNC1jaGFubmVsIHN0YWNrLlxuICAgIGNvbnN0IHsgcjogckwsIGc6IGdMLCBiOiBiTCB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgIGNvbnN0IGQgPSBpbWcuZGF0YTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHIgPSBkW2ldLCBnID0gZFtpICsgMV0sIGIgPSBkW2kgKyAyXTtcbiAgICAgIGNvbnN0IGx1bSA9IHIgPj0gZyA/IChyID49IGIgPyByIDogYikgOiBnID49IGIgPyBnIDogYjsgLy8gc2luZ2xlLWJhbmQg4oaSIG1heFxuICAgICAgZFtpXSA9IHJMW2x1bV07XG4gICAgICBkW2kgKyAxXSA9IGdMW2x1bV07XG4gICAgICBkW2kgKyAyXSA9IGJMW2x1bV07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kICh0aGUgbmV4dCB0aWNrIG9mIGEgc2xpZGVyIGRyYWcpIGhhcyBhbHJlYWR5IHJlc3RvcmVkXG4gICAgLy8gdGhpcyB0aWxlLiBXcml0aW5nIGEgc3VwZXJzZWRlZCBjb250ZXh0IGJhY2sgbWFrZXMgT1NEJ3MgY29udmVyc2lvbiB0aHJvd1xuICAgIC8vIERPTUV4Y2VwdGlvbiwgd2hpY2ggZGVzdHJveXMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZSDigJQgZG9cbiAgICAvLyBub3RoaW5nIGFuZCBsZXQgdGhlIG5ld2VyIHJvdW5kIHJlcGFpbnQgaXQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBTZWUgcmVjb2xvclRpbGU6IHRoZSB0aWxlIGNhY2hlIGNhbiBzdGlsbCBkaWUgYmV0d2VlbiB0aGUgYXdhaXRzIGFuZCBoZXJlLlxuICAgIHRyeSB7IGF3YWl0IGV2ZW50LnNldERhdGEoY3R4LCAnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiB0aWxlIGV2aWN0ZWQgKi8gfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUsIGZyb20gdGhlIGN1cnJlbnRcbiAgICogIHNsaWNlJ3Mgc2FtcGxlZCB0aWxlcyAoZ3JheXNjYWxlIOKGkiBjaGFubmVsIDA7IFJHQiDihpIgUi9HL0IpLiBOdWxsIHVudGlsIHRoZVxuICAgKiAgYXN5bmMgc2FtcGxpbmcgcmVzb2x2ZXMgb3IgaWYgaXQgd2FzIHNraXBwZWQuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgX2JpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLmdldCh0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgpO1xuICB9XG5cbiAgLyoqIE5hdGl2ZSBiaXQgZGVwdGggb2YgYSBjaGFubmVsIGZyb20gdGhlIHRpbGUgZGVzY3JpcHRvciAoOCB3aGVuIHVua25vd24pLiAqL1xuICBwcml2YXRlIGNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcj8uY2hhbm5lbEluZm8/LltjaGFubmVsSW5kZXhdPy5iaXREZXB0aCA/PyA4O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUuIEZvciA+OC1iaXQgaW1hZ2VzIGl0XG4gICAqIGZldGNoZXMgdGhlICoqbmF0aXZlKiogZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciBgL2hpc3RvZ3JhbWAgZW5kcG9pbnRcbiAgICogKHRoZSA4LWJpdCBjYW52YXMgdGlsZXMgY2FuJ3QgY2FycnkgMTYtYml0IHZhbHVlcykgYW5kIGNhY2hlcyBpdCBwZXJcbiAgICogc2xpY2UrY2hhbm5lbDsgZm9yIDgtYml0L1JHQiBpdCByZXR1cm5zIHRoZSBleGlzdGluZyBjbGllbnQtc2FtcGxlZCA4LWJpdFxuICAgKiBoaXN0b2dyYW0uIFJlYWQtb25seSDigJQgaXQgbmV2ZXIgdG91Y2hlcyB0aGUgdGlsZS9kaXNwbGF5IHBpcGVsaW5lLlxuICAgKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXgpIDw9IDggfHwgIXRoaXMuaW5mb0I2NCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLm5hdGl2ZSQodGhpcy5pbmZvQjY0LCB0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRiBhdFxuICAgKiBuYXRpdmUgYml0IGRlcHRoIHZpYSBgR0VUIC9leHBvcnQvdGlmZmAgKHRoZSBzZXJ2ZXIgcmVhZHMgdGhlIHJhdyAxNi1iaXRcbiAgICogcGxhbmVzIOKAlCB0aGUgY2xpZW50IG5ldmVyIHNlZXMgdGhlbSkuIFNlbmRzIG9ubHkgdGhlIHZpc2libGUgY2hhbm5lbHM7IHRoZVxuICAgKiBleGlzdGluZyA4LWJpdCBjb21wb3NpdGUgUE5HIGV4cG9ydCBpcyB1bmFmZmVjdGVkLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5mb0I2NCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmNoYW5uZWxTdGF0ZXMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4gYy5pbmRleCk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aDtcbiAgICAvLyBPbWl0IGBjaGFubmVsc2Agd2hlbiBldmVyeSBjaGFubmVsIGlzIHZpc2libGUgKHNlcnZlciBkZWZhdWx0ID0gYWxsKS5cbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgYWxsID8gYCZjaGFubmVscz0ke3Zpc2libGUuam9pbignLCcpfWAgOiAnJztcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX1leHBvcnQvdGlmZj9pbmZvPSR7dGhpcy5pbmZvQjY0fSZ6PSR7dGhpcy5jdXJyZW50Wn0ke2NoUGFyYW19YDtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAuZ2V0KHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6ICdibG9iJyB9KVxuICAgICAgICAgIC5waXBlKHRpbWVvdXQoNjAwMDAwKSksIC8vIGxhcmdlIGV4cG9ydHMgc3RyZWFtIHNsb3dseTsgZ2VuZXJvdXMgZGVhZGxpbmVcbiAgICAgICk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsb2IgPSByZXNwLmJvZHk7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19XzE2Yml0Lm9tZS50aWZgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IFRJRkYgZXhwb3J0IGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgY3VycmVudCBzbGljZSBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBjb21wb3NpdGVkIHdpdGggdGhlXG4gICAqIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIG9yIHBlci1jaGFubmVsIHBzZXVkby1cbiAgICogY29sb3VycyAvIGludmVydCkuIFBpY2tzIHRoZSBsYXJnZXN0IHB5cmFtaWQgbGV2ZWwgdW5kZXIgYSBwaXhlbCBjYXAgKHRoZVxuICAgKiBjb2Fyc2VyIG92ZXJ2aWV3IGZvciBodWdlIHdob2xlLXNsaWRlcyksIGZldGNoZXMgdGhhdCBsZXZlbCdzIHRpbGUgZ3JpZCxcbiAgICogc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLCBydW5zIHRoZSBzaGFyZWQgZGlzcGxheSBwaXBlbGluZSwgYW5kIHNhdmVzIGl0LlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Q29tcG9zaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgbGV2ZWxzID0gZGVzYz8ubGV2ZWxzID8/IFtdO1xuICAgIGlmICghZGVzYyB8fCAhdGhpcy5pbmZvQjY0IHx8ICFsZXZlbHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgQ0FQID0gMzJfMDAwXzAwMDsgLy8gfjMyIE1QIOKAlCBib3VuZHMgbWVtb3J5IGZvciB3aG9sZS1zbGlkZSBpbWFnZXNcbiAgICBsZXQgcmVzID0gbGV2ZWxzLmxlbmd0aCAtIDE7IC8vIGNvYXJzZXN0IGZhbGxiYWNrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsZXZlbHNbaV0ud2lkdGggKiBsZXZlbHNbaV0uaGVpZ2h0IDw9IENBUCkgeyByZXMgPSBpOyBicmVhazsgfVxuICAgIH1cbiAgICBjb25zdCBsdyA9IGxldmVsc1tyZXNdLndpZHRoO1xuICAgIGNvbnN0IGxoID0gbGV2ZWxzW3Jlc10uaGVpZ2h0O1xuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplO1xuICAgIGNvbnN0IGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHcgLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaCAvIHQpKTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBsdztcbiAgICBjYW52YXMuaGVpZ2h0ID0gbGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICBjb25zdCB6ID0gdGhpcy5jdXJyZW50WjtcbiAgICBjb25zdCBqb2JzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sczsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCB0aGlzLmluZm9CNjQsIHsgcmVzLCBjb2wsIHJvdywgeiwgdGlsZVNpemU6IHQgfSk7XG4gICAgICAgIGpvYnMucHVzaChcbiAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlQml0bWFwKHRoaXMuaHR0cCwgdXJsLCAzMDAwMCk7XG4gICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgICAgICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBTa2lwIGEgZmFpbGVkIHRpbGUg4oCUIHRoZSBleHBvcnRlZCBjb21wb3NpdGUgaGFzIGEgZ2FwIHRoZXJlLlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgdGlsZSBmZXRjaCBmYWlsZWQsIHNraXBwaW5nJywgdXJsLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGpvYnMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGx3LCBsaCk7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltYWdlRGF0YS5kYXRhKSkgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gS2VlcCB0aGUgdW4tcmVjb2xvcmVkIGNvbXBvc2l0ZSBpZiByZWFkYmFjayBmYWlscyDigJQgYnV0IHNheSB3aHkuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgcmVjb2xvciByZWFkYmFjayBmYWlsZWQg4oCUIGV4cG9ydGluZyByYXcgdGlsZXMnLCBlcnIpO1xuICAgIH1cbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19X2NvbXBvc2l0ZS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBhbnkgcGl4ZWwgaW4gdGhlIFJHQkEgYnVmZmVyIGlzIG5vbi10cmFuc3BhcmVudC4gKi9cbiAgcHJpdmF0ZSBoYXNPcGFxdWUoZDogVWludDhDbGFtcGVkQXJyYXkpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkW2ldICE9PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEaXNwbGF5T3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFZpc3VhbGl6ZXJTdG9yZSwgc28gT1NEIGFuZCBQbG90bHkgc3RheSBpbiBsb2NrLXN0ZXAuIE9TRCBhcHBsaWVzIHRoZVxuICAvLyBjb2xvcm1hcCB0byBncmF5c2NhbGUgdGlsZXMgdmlhIHRoZSBMVVQgcmVhY3RpdmVseSAoc2VlIHRoZSBjb25zdHJ1Y3RvcidzXG4gIC8vIGNvbG9ybWFwIHN1YnNjcmlwdGlvbiksIG5vdCBpbiBzZXRDb2xvcm1hcC5cblxuICAvLyDilIDilIAgSVZpc3VhbGl6ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29sb3JtYXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IG51bGw7XG4gICAgLy8gRHJvcCBhIHF1ZXVlZCBpbnZhbGlkYXRpb24gc28gaXQgY2FuJ3QgZmlyZSBhZ2FpbnN0IGEgdG9ybi1kb3duIHZpZXdlci5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmludmFsaWRhdGVIYW5kbGUpO1xuICAgICAgZWxzZSBjbGVhclRpbWVvdXQodGhpcy5pbnZhbGlkYXRlSGFuZGxlIGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbn1cbiJdfQ==