UNPKG

@ionic-native/firebase-x

Version:

Ionic Native - Native plugins for ionic apps

99 lines 52 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import { IonicNativePlugin, cordova } from '@ionic-native/core'; import { Observable } from 'rxjs'; var FirebaseXOriginal = /** @class */ (function (_super) { __extends(FirebaseXOriginal, _super); function FirebaseXOriginal() { return _super !== null && _super.apply(this, arguments) || this; } FirebaseXOriginal.prototype.getToken = function () { return cordova(this, "getToken", {}, arguments); }; FirebaseXOriginal.prototype.getId = function () { return cordova(this, "getId", {}, arguments); }; FirebaseXOriginal.prototype.getCurrentUser = function () { return cordova(this, "getCurrentUser", {}, arguments); }; FirebaseXOriginal.prototype.reloadCurrentUser = function () { return cordova(this, "reloadCurrentUser", {}, arguments); }; FirebaseXOriginal.prototype.onTokenRefresh = function () { return cordova(this, "onTokenRefresh", { "observable": true }, arguments); }; FirebaseXOriginal.prototype.getAPNSToken = function () { return cordova(this, "getAPNSToken", {}, arguments); }; FirebaseXOriginal.prototype.onApnsTokenReceived = function () { return cordova(this, "onApnsTokenReceived", { "observable": true }, arguments); }; FirebaseXOriginal.prototype.onMessageReceived = function () { return cordova(this, "onMessageReceived", { "observable": true }, arguments); }; FirebaseXOriginal.prototype.grantPermission = function () { return cordova(this, "grantPermission", { "platforms": ["iOS"] }, arguments); }; FirebaseXOriginal.prototype.hasPermission = function () { return cordova(this, "hasPermission", {}, arguments); }; FirebaseXOriginal.prototype.unregister = function () { return cordova(this, "unregister", {}, arguments); }; FirebaseXOriginal.prototype.setBadgeNumber = function (badgeNumber) { return cordova(this, "setBadgeNumber", {}, arguments); }; FirebaseXOriginal.prototype.getBadgeNumber = function () { return cordova(this, "getBadgeNumber", {}, arguments); }; FirebaseXOriginal.prototype.clearAllNotifications = function () { return cordova(this, "clearAllNotifications", { "platforms": ["Android"] }, arguments); }; FirebaseXOriginal.prototype.subscribe = function (topic) { return cordova(this, "subscribe", {}, arguments); }; FirebaseXOriginal.prototype.unsubscribe = function (topic) { return cordova(this, "unsubscribe", {}, arguments); }; FirebaseXOriginal.prototype.isAutoInitEnabled = function () { return cordova(this, "isAutoInitEnabled", {}, arguments); }; FirebaseXOriginal.prototype.setAutoInitEnabled = function (enabled) { return cordova(this, "setAutoInitEnabled", {}, arguments); }; FirebaseXOriginal.prototype.createChannel = function (channelOptions) { return cordova(this, "createChannel", {}, arguments); }; FirebaseXOriginal.prototype.setDefaultChannel = function (channelOptions) { return cordova(this, "setDefaultChannel", {}, arguments); }; FirebaseXOriginal.prototype.deleteChannel = function (channelID) { return cordova(this, "deleteChannel", {}, arguments); }; FirebaseXOriginal.prototype.listChannels = function () { return cordova(this, "listChannels", {}, arguments); }; FirebaseXOriginal.prototype.setAnalyticsCollectionEnabled = function (enabled) { return cordova(this, "setAnalyticsCollectionEnabled", {}, arguments); }; FirebaseXOriginal.prototype.setCrashlyticsCollectionEnabled = function (enabled) { return cordova(this, "setCrashlyticsCollectionEnabled", {}, arguments); }; FirebaseXOriginal.prototype.setPerformanceCollectionEnabled = function (enabled) { return cordova(this, "setPerformanceCollectionEnabled", {}, arguments); }; FirebaseXOriginal.prototype.logEvent = function (type, data) { return cordova(this, "logEvent", {}, arguments); }; FirebaseXOriginal.prototype.setScreenName = function (name) { return cordova(this, "setScreenName", {}, arguments); }; FirebaseXOriginal.prototype.setUserId = function (userId) { return cordova(this, "setUserId", {}, arguments); }; FirebaseXOriginal.prototype.setUserProperty = function (name, value) { return cordova(this, "setUserProperty", {}, arguments); }; FirebaseXOriginal.prototype.setCrashlyticsUserId = function (userId) { return cordova(this, "setCrashlyticsUserId", {}, arguments); }; FirebaseXOriginal.prototype.sendCrash = function () { return cordova(this, "sendCrash", {}, arguments); }; FirebaseXOriginal.prototype.logMessage = function (message) { return cordova(this, "logMessage", {}, arguments); }; FirebaseXOriginal.prototype.logError = function (error, stackTrace) { return cordova(this, "logError", {}, arguments); }; FirebaseXOriginal.prototype.verifyPhoneNumber = function (phoneNumber, timeOutDuration, fakeVerificationCode) { return cordova(this, "verifyPhoneNumber", { "callbackOrder": "reverse" }, arguments); }; FirebaseXOriginal.prototype.setLanguageCode = function (lang) { return cordova(this, "setLanguageCode", {}, arguments); }; FirebaseXOriginal.prototype.signInWithCredential = function (credential) { return cordova(this, "signInWithCredential", {}, arguments); }; FirebaseXOriginal.prototype.createUserWithEmailAndPassword = function (email, password) { return cordova(this, "createUserWithEmailAndPassword", {}, arguments); }; FirebaseXOriginal.prototype.signInUserWithEmailAndPassword = function (email, password) { return cordova(this, "signInUserWithEmailAndPassword", {}, arguments); }; FirebaseXOriginal.prototype.signInUserWithCustomToken = function (customToken) { return cordova(this, "signInUserWithCustomToken", {}, arguments); }; FirebaseXOriginal.prototype.signInUserAnonymously = function () { return cordova(this, "signInUserAnonymously", {}, arguments); }; FirebaseXOriginal.prototype.authenticateUserWithGoogle = function (clientId) { return cordova(this, "authenticateUserWithGoogle", {}, arguments); }; FirebaseXOriginal.prototype.authenticateUserWithApple = function (locale) { return cordova(this, "authenticateUserWithApple", { "callbackOrder": "reverse" }, arguments); }; FirebaseXOriginal.prototype.linkUserWithCredential = function (credential, success, error) { return cordova(this, "linkUserWithCredential", {}, arguments); }; FirebaseXOriginal.prototype.reauthenticateWithCredential = function (credential, success, error) { return cordova(this, "reauthenticateWithCredential", {}, arguments); }; FirebaseXOriginal.prototype.isUserSignedIn = function () { return cordova(this, "isUserSignedIn", {}, arguments); }; FirebaseXOriginal.prototype.signOutUser = function () { return cordova(this, "signOutUser", {}, arguments); }; FirebaseXOriginal.prototype.updateUserProfile = function (profile) { return cordova(this, "updateUserProfile", {}, arguments); }; FirebaseXOriginal.prototype.updateUserEmail = function (email) { return cordova(this, "updateUserEmail", {}, arguments); }; FirebaseXOriginal.prototype.sendUserEmailVerification = function () { return cordova(this, "sendUserEmailVerification", {}, arguments); }; FirebaseXOriginal.prototype.updateUserPassword = function (password) { return cordova(this, "updateUserPassword", {}, arguments); }; FirebaseXOriginal.prototype.sendUserPasswordResetEmail = function (email) { return cordova(this, "sendUserPasswordResetEmail", {}, arguments); }; FirebaseXOriginal.prototype.deleteUser = function () { return cordova(this, "deleteUser", {}, arguments); }; FirebaseXOriginal.prototype.registerAuthStateChangeListener = function (fn) { return cordova(this, "registerAuthStateChangeListener", {}, arguments); }; FirebaseXOriginal.prototype.fetch = function (cacheExpirationSeconds) { return cordova(this, "fetch", {}, arguments); }; FirebaseXOriginal.prototype.activateFetched = function () { return cordova(this, "activateFetched", {}, arguments); }; FirebaseXOriginal.prototype.getValue = function (key) { return cordova(this, "getValue", {}, arguments); }; FirebaseXOriginal.prototype.getByteArray = function (key) { return cordova(this, "getByteArray", {}, arguments); }; FirebaseXOriginal.prototype.getInfo = function () { return cordova(this, "getInfo", {}, arguments); }; FirebaseXOriginal.prototype.setConfigSettings = function (settings) { return cordova(this, "setConfigSettings", {}, arguments); }; FirebaseXOriginal.prototype.setDefaults = function (settings) { return cordova(this, "setDefaults", {}, arguments); }; FirebaseXOriginal.prototype.startTrace = function (name) { return cordova(this, "startTrace", {}, arguments); }; FirebaseXOriginal.prototype.incrementCounter = function (name) { return cordova(this, "incrementCounter", {}, arguments); }; FirebaseXOriginal.prototype.stopTrace = function (name) { return cordova(this, "stopTrace", {}, arguments); }; FirebaseXOriginal.prototype.addDocumentToFirestoreCollection = function (document, collection, success, error) { return cordova(this, "addDocumentToFirestoreCollection", {}, arguments); }; FirebaseXOriginal.prototype.setDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { return cordova(this, "setDocumentInFirestoreCollection", {}, arguments); }; FirebaseXOriginal.prototype.updateDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { return cordova(this, "updateDocumentInFirestoreCollection", {}, arguments); }; FirebaseXOriginal.prototype.deleteDocumentFromFirestoreCollection = function (documentId, collection, success, error) { return cordova(this, "deleteDocumentFromFirestoreCollection", {}, arguments); }; FirebaseXOriginal.prototype.fetchDocumentInFirestoreCollection = function (documentId, collection, success, error) { return cordova(this, "fetchDocumentInFirestoreCollection", {}, arguments); }; FirebaseXOriginal.prototype.fetchFirestoreCollection = function (collection, success, error) { return cordova(this, "fetchFirestoreCollection", {}, arguments); }; FirebaseXOriginal.pluginName = "FirebaseX"; FirebaseXOriginal.plugin = "cordova-plugin-firebasex"; FirebaseXOriginal.pluginRef = "FirebasePlugin"; FirebaseXOriginal.repo = "https://github.com/dpa99c/cordova-plugin-firebasex"; FirebaseXOriginal.platforms = ["Android", "iOS"]; return FirebaseXOriginal; }(IonicNativePlugin)); var FirebaseX = new FirebaseXOriginal(); export { FirebaseX }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQGlvbmljLW5hdGl2ZS9wbHVnaW5zL2ZpcmViYXNlLXgvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUNBLE9BQU8sOEJBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7SUF1SkgsNkJBQWlCOzs7O0lBTTlDLDRCQUFRO0lBU1IseUJBQUs7SUFTTCxrQ0FBYztJQVNkLHFDQUFpQjtJQVdqQixrQ0FBYztJQVVkLGdDQUFZO0lBYVosdUNBQW1CO0lBYW5CLHFDQUFpQjtJQVdqQixtQ0FBZTtJQVNmLGlDQUFhO0lBUWIsOEJBQVU7SUFVVixrQ0FBYyxhQUFDLFdBQW1CO0lBU2xDLGtDQUFjO0lBV2QseUNBQXFCO0lBVXJCLDZCQUFTLGFBQUMsS0FBYTtJQVV2QiwrQkFBVyxhQUFDLEtBQWE7SUFRekIscUNBQWlCO0lBU2pCLHNDQUFrQixhQUFDLE9BQWdCO0lBY25DLGlDQUFhLGFBQUMsY0FBK0I7SUFhN0MscUNBQWlCLGFBQUMsY0FBK0I7SUFXakQsaUNBQWEsYUFBQyxTQUFpQjtJQVUvQixnQ0FBWTtJQVVaLGlEQUE2QixhQUFDLE9BQWdCO0lBVTlDLG1EQUErQixhQUFDLE9BQWdCO0lBVWhELG1EQUErQixhQUFDLE9BQWdCO0lBV2hELDRCQUFRLGFBQUMsSUFBWSxFQUFFLElBQVM7SUFVaEMsaUNBQWEsYUFBQyxJQUFZO0lBVTFCLDZCQUFTLGFBQUMsTUFBYztJQVd4QixtQ0FBZSxhQUFDLElBQVksRUFBRSxLQUFhO0lBZTNDLHdDQUFvQixhQUFDLE1BQWM7SUFXbkMsNkJBQVM7SUFXVCw4QkFBVSxhQUFDLE9BQWU7SUFjMUIsNEJBQVEsYUFBQyxLQUFhLEVBQUUsVUFBbUI7SUErQjNDLHFDQUFpQixhQUFDLFdBQW1CLEVBQUUsZUFBdUIsRUFBRSxvQkFBNkI7SUFTN0YsbUNBQWUsYUFBQyxJQUFZO0lBVTVCLHdDQUFvQixhQUFDLFVBQWtCO0lBVXZDLGtEQUE4QixhQUFDLEtBQWEsRUFBRSxRQUFnQjtJQVU5RCxrREFBOEIsYUFBQyxLQUFhLEVBQUUsUUFBZ0I7SUFTOUQsNkNBQXlCLGFBQUMsV0FBbUI7SUFRN0MseUNBQXFCO0lBU3JCLDhDQUEwQixhQUFDLFFBQWdCO0lBVzNDLDZDQUF5QixhQUFDLE1BQWU7SUFZekMsMENBQXNCLGFBQUMsVUFBa0IsRUFBRSxPQUFtQixFQUFFLEtBQTRCO0lBVzVGLGdEQUE0QixhQUFDLFVBQWUsRUFBRSxPQUFtQixFQUFFLEtBQTRCO0lBUS9GLGtDQUFjO0lBUWQsK0JBQVc7SUFTWCxxQ0FBaUIsYUFBQyxPQUEyQztJQVM3RCxtQ0FBZSxhQUFDLEtBQWE7SUFTN0IsNkNBQXlCO0lBU3pCLHNDQUFrQixhQUFDLFFBQWdCO0lBVW5DLDhDQUEwQixhQUFDLEtBQWE7SUFReEMsOEJBQVU7SUFTVixtREFBK0IsYUFBQyxFQUFPO0lBVXZDLHlCQUFLLGFBQUMsc0JBQStCO0lBU3JDLG1DQUFlO0lBVWYsNEJBQVEsYUFBQyxHQUFXO0lBVXBCLGdDQUFZLGFBQUMsR0FBVztJQVN4QiwyQkFBTztJQVVQLHFDQUFpQixhQUFDLFFBQWE7SUFVL0IsK0JBQVcsYUFBQyxRQUFhO0lBVXpCLDhCQUFVLGFBQUMsSUFBWTtJQVl2QixvQ0FBZ0IsYUFBQyxJQUFZO0lBVTdCLDZCQUFTLGFBQUMsSUFBWTtJQVl0QixvREFBZ0MsYUFDOUIsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsT0FBNkIsRUFDN0IsS0FBNEI7SUFjOUIsb0RBQWdDLGFBQzlCLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLE9BQW1CLEVBQ25CLEtBQTRCO0lBZ0I5Qix1REFBbUMsYUFDakMsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsT0FBbUIsRUFDbkIsS0FBNEI7SUFjOUIseURBQXFDLGFBQ25DLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLE9BQW1CLEVBQ25CLEtBQTRCO0lBYzlCLHNEQUFrQyxhQUNoQyxVQUFrQixFQUNsQixVQUFrQixFQUNsQixPQUEyQixFQUMzQixLQUE0QjtJQWE5Qiw0Q0FBd0IsYUFDdEIsVUFBa0IsRUFDbEIsT0FBNEIsRUFDNUIsS0FBNEI7Ozs7OztvQkFwNUJoQztFQXlKK0IsaUJBQWlCO1NBQW5DLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbHVnaW4sIENvcmRvdmEsIElvbmljTmF0aXZlUGx1Z2luIH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbE9wdGlvbnMge1xuICAvKipcbiAgICogQ2hhbm5lbCBJRCAtIG11c3QgYmUgdW5pcXVlIHBlciBhcHAgcGFja2FnZVxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ2hhbm5lbCBuYW1lLiBEZWZhdWx0OiBlbXB0eSBzdHJpbmdcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgZGVzY3JpcHRpb24uIERlZmF1bHQ6IGVtcHR5IHN0cmluZ1xuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VuZCB0byBwbGF5IG9uY2UgYSBwdXNoIGNvbWVzLiBEZWZhdWx0IHZhbHVlOiAnZGVmYXVsdCdcbiAgICogVmFsdWVzIGFsbG93ZWQ6XG4gICAqICdkZWZhdWx0JyAtIHBsYXlzIHRoZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBzb3VuZFxuICAgKiAncmluZ3RvbmUnIC0gcGxheXMgdGhlIGN1cnJlbnRseSBzZXQgcmluZ3RvbmVcbiAgICogJ2ZhbHNlJyAtIHNpbGVudDsgZG9uJ3QgcGxheSBhbnkgc291bmRcbiAgICogZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgb2YgdGhlIHNvdW5kIGZpbGUgbG9jYXRlZCBpbiAnL3Jlcy9yYXcnIHdpdGhvdXQgZmlsZSBleHRlbnNpb24gKG15c291bmQubXAzIC0+IG15c291bmQpXG4gICAqL1xuICBzb3VuZD86IHN0cmluZztcblxuICAvKipcbiAgICogVmlicmF0ZSBvbiBuZXcgbm90aWZpY2F0aW9uLiBEZWZhdWx0IHZhbHVlOiB0cnVlXG4gICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICogQm9vbGVhbiAtIHZpYnJhdGUgb3Igbm90XG4gICAqIEFycmF5IC0gdmlicmF0aW9uIHBhdHRlcm4gLSBlLmcuIFs1MDAsIDIwMCwgNTAwXSAtIG1pbGxpc2Vjb25kcyB2aWJyYXRlLCBtaWxsaXNlY29uZHMgcGF1c2UsIHZpYnJhdGUsIHBhdXNlLCBldGMuXG4gICAqL1xuICB2aWJyYXRpb24/OiBib29sZWFuIHwgbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYmxpbmsgdGhlIExFRFxuICAgKi9cbiAgbGlnaHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMRUQgY29sb3IgaW4gQVJHQiBmb3JtYXQgLSB0aGlzIGV4YW1wbGUgQkxVRSBjb2xvci4gSWYgc2V0IHRvIC0xLCBsaWdodCBjb2xvciB3aWxsIGJlIGRlZmF1bHQuIERlZmF1bHQgdmFsdWU6IC0xLlxuICAgKi9cbiAgbGlnaHRDb2xvcj86IHN0cmluZztcblxuICAvKipcbiAgICogSW1wb3J0YW5jZSAtIGludGVnZXIgZnJvbSAwIHRvIDQuIERlZmF1bHQgdmFsdWU6IDRcbiAgICogMCAtIG5vbmUgLSBubyBzb3VuZCwgZG9lcyBub3Qgc2hvdyBpbiB0aGUgc2hhZGVcbiAgICogMSAtIG1pbiAtIG5vIHNvdW5kLCBvbmx5IHNob3dzIGluIHRoZSBzaGFkZSwgYmVsb3cgdGhlIGZvbGRcbiAgICogMiAtIGxvdyAtIG5vIHNvdW5kLCBzaG93cyBpbiB0aGUgc2hhZGUsIGFuZCBwb3RlbnRpYWxseSBpbiB0aGUgc3RhdHVzIGJhclxuICAgKiAzIC0gZGVmYXVsdCAtIHNob3dzIGV2ZXJ5d2hlcmUsIG1ha2VzIG5vaXNlLCBidXQgZG9lcyBub3QgdmlzdWFsbHkgaW50cnVkZVxuICAgKiA0IC0gaGlnaCAtIHNob3dzIGV2ZXJ5d2hlcmUsIG1ha2VzIG5vaXNlIGFuZCBwZWVrc1xuICAgKi9cbiAgaW1wb3J0YW5jZT86IDAgfCAxIHwgMiB8IDMgfCA0O1xuXG4gIC8qKlxuICAgKiBTaG93IGJhZGdlIG92ZXIgYXBwIGljb24gd2hlbiBub24gaGFuZGxlZCBwdXNoZXMgYXJlIHByZXNlbnQuIERlZmF1bHQgdmFsdWU6IHRydWVcbiAgICovXG4gIGJhZGdlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdyBtZXNzYWdlIG9uIGxvY2tlZCBzY3JlZW4uIERlZmF1bHQgdmFsdWU6IDFcbiAgICogUG9zc2libGUgdmFsdWVzIChkZWZhdWx0IDEpOlxuICAgKiAtMSAtIHNlY3JldCAtIERvIG5vdCByZXZlYWwgYW55IHBhcnQgb2YgdGhlIG5vdGlmaWNhdGlvbiBvbiBhIHNlY3VyZSBsb2Nrc2NyZWVuLlxuICAgKiAwIC0gcHJpdmF0ZSAtIFNob3cgdGhlIG5vdGlmaWNhdGlvbiBvbiBhbGwgbG9ja3NjcmVlbnMsIGJ1dCBjb25jZWFsIHNlbnNpdGl2ZSBvciBwcml2YXRlIGluZm9ybWF0aW9uIG9uIHNlY3VyZSBsb2Nrc2NyZWVucy5cbiAgICogMSAtIHB1YmxpYyAtIFNob3cgdGhlIG5vdGlmaWNhdGlvbiBpbiBpdHMgZW50aXJldHkgb24gYWxsIGxvY2tzY3JlZW5zLlxuICAgKi9cbiAgdmlzaWJpbGl0eT86IC0xIHwgMCB8IDE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWJhc2VVc2VyIHtcbiAgLyoqXG4gICAqIElEIHRva2VuXG4gICAqL1xuICBpZFRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlciBJRFxuICAgKi9cbiAgcHJvdmlkZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVUlEXG4gICAqL1xuICB1aWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBob3RvIHVybFxuICAgKi9cbiAgcGhvdG9Vcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBob25lIG51bWJlclxuICAgKi9cbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGlzIGVtYWlsIHZlcmlmaWVkXG4gICAqL1xuICBlbWFpbElzVmVyaWZpZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbWFpbFxuICAgKi9cbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG5hbWVcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQG5hbWUgRmlyZWJhc2UgWFxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIHBsdWdpbiBicmluZ3MgcHVzaCBub3RpZmljYXRpb25zLCBhbmFseXRpY3MsIGV2ZW50IHRyYWNraW5nLCBjcmFzaCByZXBvcnRpbmcgYW5kIG1vcmUgZnJvbSBHb29nbGUgRmlyZWJhc2UgdG8geW91ciBDb3Jkb3ZhIHByb2plY3QhIEFuZHJvaWQgYW5kIGlPUyBzdXBwb3J0ZWQuXG4gKiBJdCBpcyBhIG1haW50YWluZWQgZm9yayBmcm9tIHVubWFpbnRhaW5lZCBpb25pYy1uYXZpdGUgcGx1Z2luIGNhbGxlZCBGaXJlYmFzZS5cbiAqXG4gKiBAdXNhZ2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEZpcmViYXNlWCB9IGZyb20gJ0Bpb25pYy1uYXRpdmUvZmlyZWJhc2UteC9uZ3gnO1xuICpcbiAqXG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpcmViYXNlWDogRmlyZWJhc2VYKSB7IH1cbiAqXG4gKiAuLi5cbiAqXG4gKlxuICogdGhpcy5maXJlYmFzZVguZ2V0VG9rZW4oKVxuICogICAudGhlbih0b2tlbiA9PiBjb25zb2xlLmxvZyhgVGhlIHRva2VuIGlzICR7dG9rZW59YCkpIC8vIHNhdmUgdGhlIHRva2VuIHNlcnZlci1zaWRlIGFuZCB1c2UgaXQgdG8gcHVzaCBub3RpZmljYXRpb25zIHRvIHRoaXMgZGV2aWNlXG4gKiAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIHRva2VuJywgZXJyb3IpKTtcbiAqXG4gKiB0aGlzLmZpcmViYXNlWC5vbk1lc3NhZ2VSZWNlaXZlZCgpXG4gKiAgIC5zdWJzY3JpYmUoZGF0YSA9PiBjb25zb2xlLmxvZyhgVXNlciBvcGVuZWQgYSBub3RpZmljYXRpb24gJHtkYXRhfWApKTtcbiAqXG4gKiB0aGlzLmZpcmViYXNlWC5vblRva2VuUmVmcmVzaCgpXG4gKiAgIC5zdWJzY3JpYmUoKHRva2VuOiBzdHJpbmcpID0+IGNvbnNvbGUubG9nKGBHb3QgYSBuZXcgdG9rZW4gJHt0b2tlbn1gKSk7XG4gKiBgYGBcbiAqIEBpbnRlcmZhY2VzXG4gKiBJQ2hhbm5lbE9wdGlvbnNcbiAqXG4gKi9cbkBQbHVnaW4oe1xuICBwbHVnaW5OYW1lOiAnRmlyZWJhc2VYJyxcbiAgcGx1Z2luOiAnY29yZG92YS1wbHVnaW4tZmlyZWJhc2V4JyxcbiAgcGx1Z2luUmVmOiAnRmlyZWJhc2VQbHVnaW4nLFxuICByZXBvOiAnaHR0cHM6Ly9naXRodWIuY29tL2RwYTk5Yy9jb3Jkb3ZhLXBsdWdpbi1maXJlYmFzZXgnLFxuICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VYIGV4dGVuZHMgSW9uaWNOYXRpdmVQbHVnaW4ge1xuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZDTSB0b2tlbi5cbiAgICogQHJldHVybiB7UHJvbWlzZTxudWxsIHwgc3RyaW5nPn0gTm90ZSB0aGF0IHRva2VuIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQgeWV0XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldFRva2VuKCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFwcCBpbnN0YW5jZSBJRCAoYW4gY29uc3RhbnQgSUQgd2hpY2ggcGVyc2lzdHMgYXMgbG9uZyBhcyB0aGUgYXBwIGlzIG5vdCB1bmluc3RhbGxlZC9yZWluc3RhbGxlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxudWxsIHwgc3RyaW5nPn0gTm90ZSB0aGF0IElEIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQgeWV0XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldElkKCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRkNNIHVzZXIuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmlyZWJhc2VVc2VyIHwgc3RyaW5nPn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZ2V0Q3VycmVudFVzZXIoKTogUHJvbWlzZTxGaXJlYmFzZVVzZXIgfCBzdHJpbmc+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRoZSBjdXJyZW50IEZDTSB1c2VyLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZpcmViYXNlVXNlciB8IHN0cmluZz59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHJlbG9hZEN1cnJlbnRVc2VyKCk6IFByb21pc2U8RmlyZWJhc2VVc2VyIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub3RpZmllZCB3aGVuIGEgdG9rZW4gaXMgcmVmcmVzaGVkLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb2JzZXJ2YWJsZTogdHJ1ZSxcbiAgfSlcbiAgb25Ub2tlblJlZnJlc2goKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogaU9TIG9ubHkuXG4gICAqIEdldCB0aGUgQVBOUyB0b2tlbiBhbGxvY2F0ZWQgZm9yIHRoaXMgYXBwIGluc3RhbGwuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8bnVsbCB8IHN0cmluZz59IE5vdGUgdGhhdCB0b2tlbiB3aWxsIGJlIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkIHlldFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRBUE5TVG9rZW4oKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIGlPUyBvbmx5LlxuICAgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgQVBOUyB0b2tlbiBpcyBhbGxvY2F0ZWQuXG4gICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSB3aGVuIHJlbW90ZSBub3RpZmljYXRpb25zIHBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCBieSB0aGUgdXNlciBhdCBydW50aW1lLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb2JzZXJ2YWJsZTogdHJ1ZSxcbiAgfSlcbiAgb25BcG5zVG9rZW5SZWNlaXZlZCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbjpcbiAgICogLSBhIG5vdGlmaWNhdGlvbiBvciBkYXRhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkgdGhlIGFwcFxuICAgKiAtIGEgc3lzdGVtIG5vdGlmaWNhdGlvbiBpcyB0YXBwZWQgYnkgdGhlIHVzZXJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG9ic2VydmFibGU6IHRydWUsXG4gIH0pXG4gIG9uTWVzc2FnZVJlY2VpdmVkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHBlcm1pc3Npb24gdG8gcmVjZWl2ZSBwdXNoIG5vdGlmaWNhdGlvbnMgKHdpbGwgdHJpZ2dlciBwcm9tcHQpIGFuZCByZXR1cm4gaGFzUGVybWlzc2lvbjogdHJ1ZS4gaU9TIG9ubHkgKEFuZHJvaWQgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUpLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgcGxhdGZvcm1zOiBbJ2lPUyddLFxuICB9KVxuICBncmFudFBlcm1pc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgcGVybWlzc2lvbiB0byByZWNlaXZlIHB1c2ggbm90aWZpY2F0aW9ucyBhbmQgcmV0dXJuIGhhc1Blcm1pc3Npb246IHRydWUuIGlPUyBvbmx5IChBbmRyb2lkIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlKS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgaGFzUGVybWlzc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBmcm9tIGZpcmViYXNlLCB1c2VkIHRvIHN0b3AgcmVjZWl2aW5nIHB1c2ggbm90aWZpY2F0aW9ucy4gQ2FsbCB0aGlzIHdoZW4geW91IGxvZ291dCB1c2VyIGZyb20geW91ciBhcHAuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHVucmVnaXN0ZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbnVtYmVyIG9uIHRoZSBpY29uIGJhZGdlLiBTZXQgMCB0byBjbGVhciB0aGUgYmFkZ2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJhZGdlTnVtYmVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0QmFkZ2VOdW1iZXIoYmFkZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpY29uIGJhZGdlIG51bWJlci5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRCYWRnZU51bWJlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcGVuZGluZyBub3RpZmljYXRpb25zIGZyb20gdGhlIGRyYXdlci5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGNsZWFyQWxsTm90aWZpY2F0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSB0b3BpYy4gVG9waWMgbWVzc2FnaW5nIGFsbG93cyB5b3UgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gbXVsdGlwbGUgZGV2aWNlcyB0aGF0IGhhdmUgb3B0ZWQgaW4gdG8gYSBwYXJ0aWN1bGFyIHRvcGljLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzdWJzY3JpYmUodG9waWM6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gYSB0b3BpYy4gVGhpcyB3aWxsIHN0b3AgeW91IHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhhdCB0b3BpYy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgdW5zdWJzY3JpYmUodG9waWM6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGF1dG9pbml0IGlzIGN1cnJlbnRseSBlbmFibGVkLiBJZiBzbywgbmV3IEZDTSB0b2tlbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgaXNBdXRvSW5pdEVuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0byBhdXRvaW5pdCBuZXcgRkNNIHRva2Vucy4gQnkgZGVmYXVsdCwgYSBuZXcgdG9rZW4gd2lsbCBiZSBnZW5lcmF0ZWQgYXMgc29vbiBhcyB0aGUgb2xkIG9uZSBpcyByZW1vdmVkLlxuICAgKiBUbyBwcmV2ZW50IGEgbmV3IHRva2VuIGJlaW5nIGdlbmVyYXRlZCwgYnkgc3VyZSB0byBkaXNhYmxlIGF1dG9pbml0IHVzaW5nIHNldEF1dG9Jbml0RW5hYmxlZCgpIGJlZm9yZSBjYWxsaW5nIHVucmVnaXN0ZXIoKS5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0QXV0b0luaXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmRyb2lkIDgrIG9ubHkuIENyZWF0ZXMgYSBjdXN0b20gY2hhbm5lbCB0byBiZSB1c2VkIGJ5IG5vdGlmaWNhdGlvbiBtZXNzYWdlcyB3aGljaCBoYXZlIHRoZSBjaGFubmVsIHByb3BlcnR5IHNldCBpbiB0aGUgbWVzc2FnZSBwYXlsb2FkIHRvIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjaGFubmVsOlxuICAgKiAtIGZvciBiYWNrZ3JvdW5kIChzeXN0ZW0pIG5vdGlmaWNhdGlvbnM6IGFuZHJvaWQubm90aWZpY2F0aW9uLmNoYW5uZWxfaWRcbiAgICogLSBmb3IgZm9yZWdyb3VuZC9kYXRhIG5vdGlmaWNhdGlvbnM6IGRhdGEubm90aWZpY2F0aW9uX2FuZHJvaWRfY2hhbm5lbF9pZFxuICAgKlxuICAgKiBDYWxsaW5nIG9uIEFuZHJvaWQgNyBvciBiZWxvdyBvciBhbm90aGVyIHBsYXRmb3JtIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAqIEBwYXJhbSB7SUNoYW5uZWxPcHRpb25zfSBjaGFubmVsT3B0aW9uc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGNyZWF0ZUNoYW5uZWwoY2hhbm5lbE9wdGlvbnM6IElDaGFubmVsT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgOCsgb25seS4gT3ZlcnJpZGVzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgZGVmYXVsdCBjaGFubmVsLlxuICAgKiBUaGUgZGVmYXVsdCBjaGFubmVsIGlzIHVzZWQgaWYgbm8gb3RoZXIgY2hhbm5lbCBleGlzdHMgb3IgaXMgc3BlY2lmaWVkIGluIHRoZSBub3RpZmljYXRpb24uXG4gICAqIEFueSBvcHRpb25zIG5vdCBzcGVjaWZpZWQgd2lsbCBub3QgYmUgb3ZlcnJpZGRlbi4gU2hvdWxkIGJlIGNhbGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlIChvbiBhcHAgc3RhcnQpIHNvIGRlZmF1bHQgbm90aWZpY2F0aW9ucyB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXG4gICAqIENhbGxpbmcgb24gQW5kcm9pZCA3IG9yIGJlbG93IG9yIGFub3RoZXIgcGxhdGZvcm0gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICogQHBhcmFtIHtJQ2hhbm5lbE9wdGlvbnN9IGNoYW5uZWxPcHRpb25zXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0RGVmYXVsdENoYW5uZWwoY2hhbm5lbE9wdGlvbnM6IElDaGFubmVsT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgOCsgb25seS4gUmVtb3ZlcyBhIHByZXZpb3VzbHkgZGVmaW5lZCBjaGFubmVsLlxuICAgKiBDYWxsaW5nIG9uIEFuZHJvaWQgNyBvciBiZWxvdyBvciBhbm90aGVyIHBsYXRmb3JtIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsSURcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBkZWxldGVDaGFubmVsKGNoYW5uZWxJRDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCA4KyBvbmx5LiBHZXRzIGEgbGlzdCBvZiBhbGwgY2hhbm5lbHMuXG4gICAqIENhbGxpbmcgb24gQW5kcm9pZCA3IG9yIGJlbG93IG9yIGFub3RoZXIgcGxhdGZvcm0gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBsaXN0Q2hhbm5lbHMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgYW5hbHl0aWNzIGNvbGxlY3Rpb24gKHVzZWZ1bCBmb3IgR0RQUi9wcml2YWN5IHNldHRpbmdzKS5cbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldEFuYWx5dGljc0NvbGxlY3Rpb25FbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUvZGlzYWJsZSBDcmFzaGx5dGljcyBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0Q3Jhc2hseXRpY3NDb2xsZWN0aW9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgcGVyZm9ybWFuY2UgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldFBlcmZvcm1hbmNlQ29sbGVjdGlvbkVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbiBldmVudCB1c2luZyBBbmFseXRpY3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBsb2dFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBzY3JlZW4gaW4gQW5hbHl0aWNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFNjcmVlbiBuYW1lXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0U2NyZWVuTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB1c2VyIGlkIGZvciB1c2UgaW4gQW5hbHl0aWNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRVc2VySWQodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB1c2VyIHByb3BlcnR5IGZvciB1c2UgaW4gQW5hbHl0aWNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldFVzZXJQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ3Jhc2hseXRpY3MgdXNlciBpZGVudGlmaWVyLlxuICAgKiBUbyBkaWFnbm9zZSBhbiBpc3N1ZSwgaXTigJlzIG9mdGVuIGhlbHBmdWwgdG8ga25vdyB3aGljaCBvZiB5b3VyIHVzZXJzIGV4cGVyaWVuY2VkIGEgZ2l2ZW4gY3Jhc2guXG4gICAqIENyYXNobHl0aWNzIGluY2x1ZGVzIGEgd2F5IHRvIGFub255bW91c2x5IGlkZW50aWZ5IHVzZXJzIGluIHlvdXIgY3Jhc2ggcmVwb3J0cy5cbiAgICogVG8gYWRkIHVzZXIgSURzIHRvIHlvdXIgcmVwb3J0cywgYXNzaWduIGVhY2ggdXNlciBhIHVuaXF1ZSBpZGVudGlmaWVyIGluIHRoZSBmb3JtIG9mIGFuIElEIG51bWJlciwgdG9rZW4sIG9yIGhhc2hlZCB2YWx1ZS5cbiAgICpcbiAgICogTW9yZSBpbmZvIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2NyYXNobHl0aWNzL2N1c3RvbWl6ZS1jcmFzaC1yZXBvcnRzP2F1dGh1c2VyPTAjc2V0X3VzZXJfaWRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0Q3Jhc2hseXRpY3NVc2VySWQodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZXMgKGNhdXNlcykgYSBmYXRhbCBuYXRpdmUgY3Jhc2ggd2hpY2ggY2F1c2VzIGEgY3Jhc2ggZXZlbnQgdG8gYmUgc2VudCB0byBDcmFzaGx5dGljcyAodXNlZnVsIGZvciB0ZXN0aW5nKS5cbiAgICogU2VlIHRoZSBGaXJlYmFzZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBjcmFzaCB0ZXN0aW5nLlxuICAgKiBDcmFzaGVzIHdpbGwgYXBwZWFyIHVuZGVyIEV2ZW50IHR5cGUgPSBcIkNyYXNoZXNcIiBpbiB0aGUgQ3Jhc2hseXRpY3MgY29uc29sZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZW5kQ3Jhc2goKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjcmFzaC1yZWxhdGVkIGxvZyBtZXNzYWdlIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIExvZ3Mgc2VjdGlvbiBvZiB0aGUgbmV4dCBuYXRpdmUgY3Jhc2ggZXZlbnQuXG4gICAqIE5vdGU6IGlmIHlvdSBkb24ndCB0aGVuIGNyYXNoLCB0aGUgbWVzc2FnZSB3b24ndCBiZSBzZW50ISBBbHNvIGxvZ3MgdGhlIG1lc3NhZ2UgdG8gdGhlIG5hdGl2ZSBkZXZpY2UgY29uc29sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBsb2dNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbm9uLWZhdGFsIGVycm9yIGV2ZW50IHRvIENyYXNobHl0aWNzLiBJbiBhIENvcmRvdmEgYXBwLCB5b3UgbWF5IHVzZSB0aGlzIHRvIGxvZyB1bmhhbmRsZWQgSmF2YXNjcmlwdCBleGNlcHRpb25zLCBmb3IgZXhhbXBsZS5cbiAgICogVGhlIGV2ZW50IHdpbGwgYXBwZWFyIHVuZGVyIEV2ZW50IHR5cGUgPSBcIk5vbi1mYXRhbHNcIiBpbiB0aGUgQ3Jhc2hseXRpY3MgY29uc29sZS5cbiAgICogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gdGhlIExvZ3Mgc2VjdGlvbiBvZiB0aGUgbm9uLWZhdGFsIGVycm9yIGV2ZW50LlxuICAgKiBBbHNvIGxvZ3MgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIG5hdGl2ZSBkZXZpY2UgY29uc29sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAob3B0aW9uYWwpIGEgc3RhY2sgdHJhY2UgZ2VuZXJhdGVkIGJ5IHN0YWNrdHJhY2UuanNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBsb2dFcnJvcihlcnJvcjogc3RyaW5nLCBzdGFja1RyYWNlPzogb2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdmVyaWZpY2F0aW9uIG9mIGEgcGhvbmUgbnVtYmVyIGluIG9yZGVyIHRvIGF1dGhlbnRpY2F0ZSBhIHVzZXIgYW5kIHNpZ24gdGhlbiBpbnRvIEZpcmViYXNlIGluIHlvdXIgYXBwLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIHdpbGwgb25seSB3b3JrIG9uIHBoeXNpY2FsIGRldmljZXMgd2l0aCBhIFNJTSBjYXJkIChub3QgaU9TIFNpbXVsYXRvciBvciBBbmRyb2lkIEVtdWxhdG9yKVxuICAgKlxuICAgKiBJbiByZXNwb25zZSB0byB5b3VyIHJlcXVlc3QsIHlvdSdsbCByZWNlaXZlIGEgdmVyaWZpY2F0aW9uIElEIHdoaWNoIHlvdSBjYW4gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHZlcmlmaWNhdGlvbiBjb2RlXG4gICAqIHRvIHNpZ24gdGhlIHVzZXIgaW4uXG4gICAqXG4gICAqIE9uIGlPUyBhbmQgc29tZSBBbmRyb2lkIGRldmljZXMsIHRoZSB1c2VyIHdpbGwgcmVjZWl2ZSBhbmQgU01TIGNvbnRhaW5pbmcgdGhlIHZlcmlmaWNhdGlvbiBjb2RlIHdoaWNoIHRoZXkgbXVzdCBtYW51YWxseSBlbnRlclxuICAgKiBpbnRvIHlvdXIgYXBwLlxuICAgKlxuICAgKiBTb21lIEFuZHJvaWQgZGV2aWNlcyBzdXBwb3J0IFwiaW5zdGFudCB2ZXJmaWNhdGlvblwiLCBpbiB3aGljaCBjYXNlIGFuIFNNUyB3aWxsIG5vdCBiZSBzZW5kIGFuZCB5b3Ugd2lsbCBiZSByZXR1cm5lZFxuICAgKiB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgYWxvbmcgd2l0aCB0aGUgdmVyaWZpY2F0aW9uIElELiBJbiB0aGlzIGNhc2UsIHRoZSB1c2VyIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBpbiBvcmRlciBmb3IgeW91XG4gICAqIHRvIHNpZ24gdGhlbSBpbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBob25lTnVtYmVyIC0gcGhvbmUgbnVtYmVyIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWVPdXREdXJhdGlvbiAtIHRpbWUgdG8gd2FpdCBpbiBzZWNvbmRzIGJlZm9yZSB0aW1pbmcgb3V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWtlVmVyaWZpY2F0aW9uQ29kZSAtIChvcHRpb25hbCkgdG8gdGVzdCBpbnN0YW50IHZlcmlmaWNhdGlvbiBvbiBBbmRyb2lkICxzcGVjaWZ5IGEgZmFrZSB2ZXJpZmljYXRpb24gY29kZSB0byByZXR1cm4gZm9yIHdoaXRlbGlzdGVkIHBob25lIG51bWJlcnMuXG4gICAqXG4gICAqIFRoZSBzdWNjZXNzIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGEgY3JlZGVudGlhbCBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqICAgaW5zdGFudFZlcmlmaWNhdGlvbiB7Ym9vbGVhbn0gLSB0cnVlIGlmIHRoZSBBbmRyb2lkIGRldmljZSBzdXBwb3J0cyBpbnN0YW50IHZlcmlmaWNhdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY3JlZGVudGlhbCBvYmplY3QuIElmIHRoaXMgaXMgZmFsc2UsIHRoZSBkZXZpY2Ugd2lsbCBiZSBzZW50IGFuIFNNUyBjb250YWluaW5nIHRoZSB2ZXJpZmljYXRpb24gY29kZSBmb3IgdGhlIHVzZXIgdG8gbWFudWFsbHkgZW50ZXIgaW50byB5b3VyIGFwcC4gQWx3YXlzIGZhbHNlIG9uIGlPUy5cbiAgICogICB2ZXJpZmljYXRpb25JZCB7c3RyaW5nfSAtIHRoZSB2ZXJpZmljYXRpb24gSUQgeW91J2xsIG5lZWQgdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSB2ZXJpZmljYXRpb24gY29kZSB0byBzaWduIHRoZSB1c2VyIGluLiBBbHdheXMgcmV0dXJuZWQgb24gYm90aCBBbmRyb2lkICYgaU9TLlxuICAgKiAgIGNvZGUge3N0cmluZ30gLSB2ZXJpZmljYXRpb24gY29kZS4gV2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgaW5zdGFudFZlcmlmaWNhdGlvbiBpcyB0cnVlLiBBbHdheXMgdW5kZWZpbmVkIG9uIGlPUy5cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScsXG4gIH0pXG4gIHZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyOiBzdHJpbmcsIHRpbWVPdXREdXJhdGlvbjogbnVtYmVyLCBmYWtlVmVyaWZpY2F0aW9uQ29kZT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCBjdXJyZW50IGF1dGhlbnRpZmljYXRpb24gc3lzdGVtIGxhbmd1YWdlLCBmb3IgZXhhbXBsZSwgdGhlIHBob25lIHNtcyBjb2RlLlxuICAgKiBAcGFyYW0gbGFuZyAtIGxhbmd1YWdlIHRvIGNoYW5nZSwgZXg6ICdmcicgZm9yIGZyZW5jaFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRMYW5ndWFnZUNvZGUobGFuZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHVzZXIgaW50byBGaXJlYmFzZSB3aXRoIGNyZWRlbnRpYWxzIG9idGFpbmVkIHVzaW5nIHZlcmlmeVBob25lTnVtYmVyKCkuXG4gICAqIFNlZSB0aGUgQW5kcm9pZC0gYW5kIGlPUy1zcGVjaWZpYyBGaXJlYmFzZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjcmVkZW50aWFsIC0gYSBjcmVkZW50aWFsIG9iamVjdCByZXR1cm5lZCBieSB0aGUgc3VjY2VzcyBjYWxsYmFjayBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZXRob2RcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbDogb2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbWFpbC9wYXNzd29yZC1iYXNlZCB1c2VyIGFjY291bnQuIElmIGFjY291bnQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdXNlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2lnbmVkIGluLlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICogQHBhcmFtIHBhc3N3b3JkXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgaW4gdG8gYW4gZW1haWwvcGFzc3dvcmQtYmFzZWQgdXNlciBhY2NvdW50LlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICogQHBhcmFtIHBhc3N3b3JkXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNpZ25JblVzZXJXaXRoRW1haWxBbmRQYXNzd29yZChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgaW4gdXNlciB3aXRoIGN1c3RvbSB0b2tlbi5cbiAgICogQHBhcmFtIGN1c3RvbVRva2VuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNpZ25JblVzZXJXaXRoQ3VzdG9tVG9rZW4oY3VzdG9tVG9rZW46IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGluIHVzZXIgYW5vbnltb3VzbHkuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNpZ25JblVzZXJBbm9ueW1vdXNseSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyIHdpdGggYSBHb29nbGUgYWNjb3VudCB0byBvYnRhaW4gYSBjcmVkZW50aWFsIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2lnbiB0aGUgdXNlciBpbi9saW5rIHRvIGFuIGV4aXN0aW5nIHVzZXIgYWNjb3VudC9yZWF1dGhlbnRpY2F0ZSB0aGUgdXNlci5cbiAgICogQHBhcmFtIGNsaWVudElkXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGF1dGhlbnRpY2F0ZVVzZXJXaXRoR29vZ2xlKGNsaWVudElkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyIHdpdGggYW4gQXBwbGUgYWNjb3VudCB1c2luZyBTaWduIEluIHdpdGggQXBwbGUgdG8gb2J0YWluIGEgY3JlZGVudGlhbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ24gdGhlIHVzZXIgaW4vbGluayB0byBhbiBleGlzdGluZyB1c2VyIGFjY291bnQvcmVhdXRoZW50aWNhdGUgdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBsb2NhbGVcbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScsXG4gIH0pXG4gIGF1dGhlbnRpY2F0ZVVzZXJXaXRoQXBwbGUobG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB0byBhbiBleGlzdGluZyBGaXJlYmFzZSB1c2VyIGFjY291bnQgd2l0aCBjcmVkZW50aWFscyBvYnRhaW5lZCB1c2luZyB2ZXJpZnlQaG9uZU51bWJlcigpLlxuICAgKiBTZWUgdGhlIEFuZHJvaWQtIGFuZCBpT1Mtc3BlY2lmaWMgRmlyZWJhc2UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY3JlZGVudGlhbCAtIGEgY3JlZGVudGlhbCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgb2YgYW4gYXV0aGVudGljYXRpb24gbWV0aG9kXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWwgc2lnbi1pbiB1c2luZyBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gZXJyb3IgbWVzc2FnZSBhcyBhbiBhcmd1bWVudFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBsaW5rVXNlcldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWw6IG9iamVjdCwgc3VjY2VzczogKCkgPT4gdm9pZCwgZXJyb3I6IChlcnI6IHN0cmluZykgPT4gdm9pZCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudGx5IHNpZ25lZCBpbiB1c2VyIHdpdGggY3JlZGVudGlhbHMgb2J0YWluZWQgdmlhIGFuIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBzdWNoIGFzIHZlcmlmeVBob25lTnVtYmVyKCkgb3IgYXV0aGVudGljYXRlVXNlcldpdGhHb29nbGUoKS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWwgLSBhIGNyZWRlbnRpYWwgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBzdWNjZXNzIGNhbGxiYWNrIG9mIGFuIGF1dGhlbnRpY2F0aW9uIG1ldGhvZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBvbiBzdWNjZXNzZnVsIHNpZ24taW4gdXNpbmcgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3IgLSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCBhIHtzdHJpbmd9IGVycm9yIG1lc3NhZ2UgYXMgYW4gYXJndW1lbnRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsOiBhbnksIHN1Y2Nlc3M6ICgpID0+IHZvaWQsIGVycm9yOiAoZXJyOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjdXJyZW50IEZpcmViYXNlIHVzZXIgc2lnbmVkIGludG8gdGhlIGFwcC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgaXNVc2VyU2lnbmVkSW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBvdXQgb2YgdGhlIGFwcC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2lnbk91dFVzZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlzcGxheSBuYW1lIGFuZC9vciBwaG90byBVUkwgb2YgdGhlIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKiBAcGFyYW0gcHJvZmlsZVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICB1cGRhdGVVc2VyUHJvZmlsZShwcm9maWxlOiB7IG5hbWU6IHN0cmluZzsgcGhvdG9Vcmk6IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcy9zZXRzIHRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IEZpcmViYXNlIHVzZXIgc2lnbmVkIGludG8gdGhlIGFwcC5cbiAgICogQHBhcmFtIGVtYWlsXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHVwZGF0ZVVzZXJFbWFpbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKiBXaGVuIHRoZSB1c2VyIG9wZW5zIHRoZSBjb250YWluZWQgbGluaywgdGhlaXIgZW1haWwgYWRkcmVzcyB3aWxsIGhhdmUgYmVlbiB2ZXJpZmllZC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2VuZFVzZXJFbWFpbFZlcmlmaWNhdGlvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzL3NldHMgdGhlIGFjY291bnQgcGFzc3dvcmQgZm9yIHRoZSBjdXJyZW50IEZpcmViYXNlIHVzZXIgc2lnbmVkIGludG8gdGhlIGFwcC5cbiAgICogQHBhcmFtIHBhc3N3b3JkXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHVwZGF0ZVVzZXJQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBwYXNzd29yZCByZXNldCBlbWFpbCB0byB0aGUgc3BlY2lmaWVkIHVzZXIgZW1haWwgYWRkcmVzcy5cbiAgICogTm90ZTogZG9lc24ndCByZXF1aXJlIHRoZSBGaXJlYmFzZSB1c2VyIHRvIGJlIHNpZ25lZCBpbiB0byB0aGUgYXBwLlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2VuZFVzZXJQYXNzd29yZFJlc2V0RW1haWwoZW1haWw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGFjY291bnQgb2YgdGhlIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBkZWxldGVVc2VyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIEphdmFzY3JpcHQgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gRmlyZWJhc2UgQXV0aGVudGljYXRpb24gc3RhdGUgY2hhbmdlcyBiZXR3ZWVuIHVzZXIgc2lnbmVkIGluL3NpZ25lZCBvdXQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gYXV0aGVudGljYXRpb24gc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgQENvcmRvdmEoKVxuICByZWdpc3RlckF1dGhTdGF0ZUNoYW5nZUxpc3RlbmVyKGZuOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBSZW1vdGUgQ29uZmlnIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHlvdXIgYXBwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVFeHBpcmF0aW9uU2Vjb25kcyBzcGVjaWZ5IHRoZSBjYWNoZUV4cGlyYXRpb25TZWNvbmRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZmV0Y2goY2FjaGVFeHBpcmF0aW9uU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBSZW1vdGUgQ29uZmlnIGZldGNoZWQgY29uZmlnLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGFjdGl2YXRlRmV0Y2hlZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIFJlbW90ZSBDb25maWcgdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRWYWx1ZShrZXk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgb25seS4gUmV0cmlldmUgYSBSZW1vdGUgQ29uZmlnIGJ5dGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRCeXRlQXJyYXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmRyb2lkIG9ubHkuIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgRmlyZWJhc2VSZW1vdGVDb25maWcgc2luZ2xldG9uIG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgb25seS4gQ2hhbmdlIHRoZSBzZXR0aW5ncyBmb3IgdGhlIEZpcmViYXNlUmVtb3RlQ29uZmlnIG9iamVjdCdzIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5nc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldENvbmZpZ1NldHRpbmdzKHNldHRpbmdzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmRyb2lkIG9ubHkuIFNldCBkZWZhdWx0cyBpbiB0aGUgUmVtb3RlIENvbmZpZy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0RGVmYXVsdHMoc2V0dGluZ3M6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgdHJhY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc3RhcnRUcmFjZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBjb3VudCB0aGUgcGVyZm9ybWFuY2UtcmVsYXRlZCBldmVudHMgdGhhdCBvY2N1ciBpbiB5b3VyIGFwcCAoc3VjaCBhcyBjYWNoZSBoaXRzIG9yIHJldHJpZXMpLFxuICAgKiBhZGQgYSBsaW5lIG9mIGNvZGUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHdoZW5ldmVyIHRoZSBldmVudCBvY2N1cnMsXG4gICAqIHVzaW5nIGEgc3RyaW5nIG90aGVyIHRoYW4gcmV0cnkgdG8gbmFtZSB0aGF0IGV2ZW50IGlmIHlvdSBhcmUgY291bnRpbmcgYSBkaWZmZXJlbnQgdHlwZSBvZiBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBpbmNyZW1lbnRDb3VudGVyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHRyYWNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHN0b3BUcmFjZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGRvY3VtZW50IHRvIGEgRmlyZXN0b3JlIGNvbGxlY3Rpb24sIHdoaWNoIHdpbGwgYmUgYWxsb2NhdGVkIGFuIGF1dG8tZ2VuZXJhdGVkIGRvY3VtZW50IElELlxuICAgKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnQgLSBkb2N1bWVudCBvYmplY3QgdG8gYWRkIHRvIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb24gLSBuYW1lIG9mIHRvcC1sZXZlbCBjb2xsZWN0aW9uIHRvIGFkZCBkb2N1bWVudCB0by5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyB0aGUgZG9jdW1lbnQuIFdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gYXJndW1lbnQgY29udGFpbmluZyB0aGUgYXV0by1nZW5lcmF0ZWQgZG9jdW1lbnQgSUQgdGhhdCB0aGUgZG9jdW1lbnQgd2FzIHN0b3JlZCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gZXJyb3IgbWVzc2FnZSBhcyBhbiBhcmd1bWVudC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgYWRkRG9jdW1lbnRUb0ZpcmVzdG9yZUNvbGxlY3Rpb24oXG4gICAgZG9jdW1lbnQ6IG9iamVjdCxcbiAgICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gICAgc3VjY2VzczogKGlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICAgZXJyb3I6IChlcnI6IHN0cmluZykgPT4gdm9pZFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIChhZGRzL3JlcGxhY2VzKSBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIElEIGluIGEgRmlyZXN0b3JlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkb2N1bWVudElkIC0gZG9jdW1lbnQgSUQgdG8gdXNlIHdoZW4gc2V0dGluZyBkb2N1bWVudCBpbiB0aGUgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRvY3VtZW50IC0gZG9jdW1lbnQgb2JqZWN0IHRvIHNldCBpbiBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbiAtIG5hbWUgb2YgdG9wLWxldmVsIGNvbGxlY3Rpb24gdG8gc2V0IGRvY3VtZW50IGluLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBvbiBzdWNjZXNzZnVsbHkgc2V0dGluZyB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSB7c3RyaW5nfSBlcnJvciBtZXNzYWdlIGFzIGFuIGFyZ3VtZW50LlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXREb2N1bWVudEluRmlyZXN0b3JlQ29sbGVjdGlvbihcbiAgICBkb2N1bWVudElkOiBzdHJpbmcsXG4gICAgZG9jdW1lbnQ6IG9iamVjdCxcbiAgICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gICAgc3VjY2VzczogKCkgPT4gdm9pZCxcbiAgICBlcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gYSBGaXJlc3RvcmUgY29sbGVjdGlvbi4gVGhpcyBpcyBhIG5vbi1kZXN0cnVjdGl2ZSB1cGRhdGUgdGhhdCB3aWxsIG9ubHlcbiAgICogb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMgaW4gdGhlIGV4aXN0aW5nIGRvY3VtZW50IG9yIGFkZCBuZXcgb25lcyBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QuIElmIHRoZSBubyBkb2N1bWVudCB3aXRoIHRoZVxuICAgKiBzcGVjaWZpZWQgSUQgZXhpc3RzIGluIHRoZSBjb2xsZWN0aW9uLCBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvY3VtZW50SWQgLSBkb2N1bWVudCBJRCBvZiB0aGUgZG9jdW1lbnQgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnQgLSBlbnRpcmUgZG9jdW1lbnQgb3IgZG9jdW1lbnQgZnJhZ21lbnQgdG8gdXBkYXRlIGV4aXN0aW5nIGRvY3VtZW50IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uIC0gbmFtZSBvZiB0b3AtbGV2ZWwgY29sbGVjdGlvbiB0byB1cGRhdGUgZG9jdW1lbnQgaW4uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWxseSB1cGRhdGluZyB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSB7c3RyaW5nfSBlcnJvciBtZXNzYWdlIGFzIGFuIGFyZ3VtZW50LlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICB1cGRhdGVEb2N1bWVudEluRmlyZXN0b3JlQ29sbGVjdGlvbihcbiAgICBkb2N1bWVudElkOiBzdHJpbmcsXG4gICAgZG9jdW1lbnQ6IG9iamVjdCxcbiAgICBjb2xsZWN0aW9uOiBzdHJpbmcsXG4gICAgc3VjY2VzczogKCkgPT4gdm9pZCxcbiAgICBlcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gYSBGaXJlc3RvcmUgY29sbGVjdGlvbi5cbiAgICogLSBOb3RlOiBJZiB0aGUgbm8gZG9jdW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGV4aXN0cyBpbiB0aGUgY29sbGVjdGlvbiwgdGhlIEZpcmViYXNlIFNESyB3aWxsIHN0aWxsIHJldHVybiBhIHN1Y2Nlc3NmdWwgb3V0Y29tZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvY3VtZW50SWQgLSBkb2N1bWVudCBJRCBvZiB0aGUgZG9jdW1lbnQgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbiAtIG5hbWUgb2YgdG9wLWxldmVsIGNvbGxlY3Rpb24gdG8gZGVsZXRlIGRvY3VtZW50IGluLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBvbiBzdWNjZXNzZnVsbHkgZGVsZXRpbmcgdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvciAtICBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCBhIHtzdHJpbmd9IGVycm9yIG1lc3NhZ2UgYXMgYW4gYXJndW1lbnQuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGRlbGV0ZURvY3VtZW50RnJvbUZpcmVzdG9yZUNvbGxlY3Rpb24oXG4gICAgZG9jdW1lbnRJZDogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgICBzdWNjZXNzOiAoKSA9PiB2b2lkLFxuICAgIGVycm9yOiAoZXJyOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbiBleGlzdGluZyBkb2N1bWVudCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIGEgRmlyZXN0b3JlIGNvbGxlY3Rpb24uXG4gICAqIC1Ob3RlOiBJZiB0aGUgbm8gZG9jdW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGV4aX