UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

242 lines 24.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Renderer2, Output, Input, EventEmitter } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { RecaptchaDataService } from './recaptcha-data.service'; export class RecaptchaComponent { /** * @param {?} dataService * @param {?} _renderer * @param {?} _http */ constructor(dataService, _renderer, _http) { this.dataService = dataService; this._renderer = _renderer; this._http = _http; this.language = 'en'; this.onValidToken = new EventEmitter(); this.errorVerifyAnswer = null; /** * ************************ * * Translated Messages ** * * *UPDATE REQUIRED* ** * ************************** */ this.translatedMessages = { playAudio: { en: 'Play Audio', zh: '播放声音', fr: 'Lecture audio', pa: 'ਆਡੀਓ ਚਲਾਓ', }, tryAnotherImg: { en: 'Try another image', zh: '换个图像', fr: 'Essayez une autre image', pa: 'ਕੋਈ ਹੋਰ ਚਿੱਤਰ ਅਜ਼ਮਾਓ', }, userPromptMessage: { en: 'Enter the text you either see in the box or you hear in the audio', zh: '请输入看到或听到的文字', fr: 'Entrez le texte que vous voyez dans la case ou que vous entendez dans le son', pa: 'ਉਹ ਟੈਕਸਟ ਦਾਖਲ ਕਰੋ ਜੋ ਤੁਸੀਂ ਬਕਸੇ ਵਿੱਚ ਦੇਖਦੇ ਹੋ ਜਾਂ ਤੁਸੀਂ ਆਡੀਓ ਵਿੱਚ ਸੁਣਦੇ ਹੋ', }, incorrectAnswer: { en: 'Incorrect answer, please try again.', zh: '答案不对。请重试。', fr: 'Mauvaise réponse, veuillez réessayer.', pa: 'ਗਲਤ ਜਵਾਬ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ.', }, successMessage: { en: 'You can submit your application now.', zh: '你现在可以提交申请了。', fr: 'Vous pouvez soumettre votre candidature maintenant.', pa: 'ਤੁਸੀਂ ਆਪਣੀ ਅਰਜ਼ੀ ਹੁਣੇ ਪੇਸ਼ ਕਰ ਸਕਦੇ ਹੋ', }, correct: { en: 'Correct.', zh: '正确。', fr: 'Correct.', pa: 'ਸਹੀ ਕਰੋ', }, loadingImage: { en: 'Loading CAPTCHA image', zh: '正在下载验证码', fr: 'Chargement de l\'image CAPTCHA', pa: 'ਕੈਪਟਚਾ ਚਿੱਤਰ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ', }, browserNotSupportAudio: { en: 'Your browser does not support the audio element.', zh: '你的浏览器不支持播音', fr: 'Votre navigateur ne supporte pas l\'élément audio.', pa: 'ਤੁਹਾਡਾ ਬ੍ਰਾਉਜ਼ਰ ਆਡੀਓ ਐਲੀਮੈਂਟ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ.', }, verifyingAnswer: { en: 'Verifying your answer...', zh: '正在验证答案...', fr: 'Vérification de votre réponse ...', pa: 'ਤੁਹਾਡਾ ਜਵਾਬ ਤਸਦੀਕ ਕਰ ਰਿਹਾ ਹੈ ...', }, errorRetrievingImg: { en: 'Error happened while retrieving CAPTCHA image. Please {{Click Here}} to try again', zh: '验证码下载错误。请{{点击这里}}重试', fr: 'Une erreur s\'est produite lors de la récupération de l\'image CAPTCHA. S\'il vous plaît {{Cliquez Ici}} pour réessayer', pa: 'ਕੈਪਟਚਾ ਚਿੱਤਰ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਦੇ ਸਮੇਂ ਤਰੁੱਟੀ ਉਤਪੰਨ ਹੋਈ. ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ {{ਇੱਥੇ ਕਲਿਕ ਕਰੋ}}', }, errorVerifyingAnswer: { en: 'Error happened while verifying your answer. Please {{Click Here}} to try again', zh: '验证答案过程发生错误。请{{点击这里}}重试', fr: 'Une erreur s\'est produite lors de la vérification de votre réponse. S\'il vous plaît {{Cliquez Ici}} pour réessayer', pa: 'ਤੁਹਾਡਾ ਜਵਾਬ ਤਸਦੀਕ ਕਰਨ ਵੇਲੇ ਗਲਤੀ ਆਈ ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ {{ਇੱਥੇ ਕਲਿਕ ਕਰੋ}}', }, }; } /** * @return {?} */ ngOnInit() { /** @type {?} */ let script = this._renderer.createElement('script'); script.defer = true; script.async = true; script.src = "https://www.google.com/recaptcha/api.js"; this._renderer.appendChild(document.body, script); } /** * @param {?} token * @return {?} */ resolved(token) { console.log(token); this.state = CAPTCHA_STATE.VERIFYING_TOKEN; this.dataService.verifyRecaptcha(this.apiBaseUrl, this.nonce, token).subscribe((/** * @param {?} response * @return {?} */ response => { /** @type {?} */ const payload = response.body; if (this.isValidPayload(payload)) { this.state = CAPTCHA_STATE.SUCCESS_VERIFY_ANSWER_CORRECT; this.onValidToken.emit(payload.jwt); } else { this.state = CAPTCHA_STATE.ERROR_VERIFY; this.errorVerifyAnswer = this.createErrorTextLine(response); } })); } /** * Case where HTTP 200 response code is received by the payload is incorrect or corrupt. * The occurance of this type of case should be rare. * @private * @param {?} payload * @return {?} */ isValidPayload(payload) { if (!payload) { console.error('payload cannot be null or undefined or 0'); return false; } else { /** @type {?} */ const hasValidProp = payload.hasOwnProperty('valid'); console.log("hasValidProp:", hasValidProp); if (hasValidProp) { console.log("payload.valid:", payload.valid); console.log("typeof payload.valid:", typeof payload.valid); } if (!hasValidProp || payload.valid === false) { console.error('Error verifying captcha'); return false; } else { return true; } } } /** * @private * @param {?} error * @return {?} */ createErrorTextLine(error) { /** @type {?} */ let line = 'Error status: ' + error.status; if (error.statusText) { line = line + ', status text: ' + error.statusText; } return line; } } RecaptchaComponent.decorators = [ { type: Component, args: [{ selector: 'common-recaptcha', template: "<div class=\"bcgov-recaptcha\">\r\n <re-captcha (resolved)=\"resolved($event)\" siteKey={{publicKey}}>\r\n </re-captcha>\r\n\r\n <div class=\"error-captcha\" *ngIf=\"state === 6\" role=\"alert\" aria-live=\"assertive\">\r\n <svg class=\"icon-exclamation-triangle\"><use xlink:href=\"#icon-exclamation-triangle-def\"></use></svg>\r\n <span>{{translatedMessages.errorVerifyingAnswer[language].substring(0,translatedMessages.errorVerifyingAnswer[language].indexOf('{'))}}\r\n {{translatedMessages.errorVerifyingAnswer[language].substring(translatedMessages.errorVerifyingAnswer[language].lastIndexOf('}')+1)}}\r\n </span>\r\n <p>\r\n </p>\r\n </div>\r\n</div>\r\n", styles: [""] }] } ]; /** @nocollapse */ RecaptchaComponent.ctorParameters = () => [ { type: RecaptchaDataService }, { type: Renderer2 }, { type: HttpClient } ]; RecaptchaComponent.propDecorators = { apiBaseUrl: [{ type: Input, args: ['apiBaseUrl',] }], nonce: [{ type: Input, args: ['nonce',] }], publicKey: [{ type: Input, args: ['publicKey',] }], language: [{ type: Input, args: ['language',] }], onValidToken: [{ type: Output }] }; if (false) { /** @type {?} */ RecaptchaComponent.prototype.apiBaseUrl; /** @type {?} */ RecaptchaComponent.prototype.nonce; /** @type {?} */ RecaptchaComponent.prototype.publicKey; /** @type {?} */ RecaptchaComponent.prototype.language; /** @type {?} */ RecaptchaComponent.prototype.onValidToken; /** @type {?} */ RecaptchaComponent.prototype.errorVerifyAnswer; /** @type {?} */ RecaptchaComponent.prototype.state; /** * ************************ * * Translated Messages ** * * *UPDATE REQUIRED* ** * ************************** * @type {?} */ RecaptchaComponent.prototype.translatedMessages; /** * @type {?} * @private */ RecaptchaComponent.prototype.dataService; /** * @type {?} * @private */ RecaptchaComponent.prototype._renderer; /** * @type {?} * @private */ RecaptchaComponent.prototype._http; } /** @enum {number} */ const CAPTCHA_STATE = { VERIFYING_TOKEN: 1, SUCCESS_VERIFY_ANSWER_CORRECT: 2, ERROR_VERIFY: 3, }; CAPTCHA_STATE[CAPTCHA_STATE.VERIFYING_TOKEN] = 'VERIFYING_TOKEN'; CAPTCHA_STATE[CAPTCHA_STATE.SUCCESS_VERIFY_ANSWER_CORRECT] = 'SUCCESS_VERIFY_ANSWER_CORRECT'; CAPTCHA_STATE[CAPTCHA_STATE.ERROR_VERIFY] = 'ERROR_VERIFY'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliL3JlY2FwdGNoYS8iLCJzb3VyY2VzIjpbInJlY2FwdGNoYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU9oRSxNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7SUFZN0IsWUFBcUIsV0FBaUMsRUFBVSxTQUFvQixFQUFVLEtBQWlCO1FBQTFGLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBUDVGLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFFakMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXBELHNCQUFpQixHQUFHLElBQUksQ0FBQzs7Ozs7OztRQWlFbEIsdUJBQWtCLEdBQUc7WUFDMUIsU0FBUyxFQUFFO2dCQUNULEVBQUUsRUFBRSxZQUFZO2dCQUNoQixFQUFFLEVBQUUsTUFBTTtnQkFDVixFQUFFLEVBQUUsZUFBZTtnQkFDbkIsRUFBRSxFQUFFLFdBQVc7YUFDaEI7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsRUFBRSxFQUFFLG1CQUFtQjtnQkFDdkIsRUFBRSxFQUFFLE1BQU07Z0JBQ1YsRUFBRSxFQUFFLHlCQUF5QjtnQkFDN0IsRUFBRSxFQUFFLHNCQUFzQjthQUMzQjtZQUNELGlCQUFpQixFQUFFO2dCQUNqQixFQUFFLEVBQUUsbUVBQW1FO2dCQUN2RSxFQUFFLEVBQUUsYUFBYTtnQkFDakIsRUFBRSxFQUFFLDhFQUE4RTtnQkFDbEYs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Q2IsS0FBSyxTQUFDLFdBQVc7dUJBQ2pCLEtBQUssU0FBQyxVQUFVOzJCQUVoQixNQUFNOzs7O0lBTFAsd0NBQXdDOztJQUN4QyxtQ0FBOEI7O0lBQzlCLHVDQUFzQzs7SUFDdEMsc0NBQTJDOztJQUUzQywwQ0FBb0Q7O0lBRXBELCtDQUF5Qjs7SUFDekIsbUNBQXFCOzs7Ozs7OztJQWdFckIsZ0RBbUVFOzs7OztJQWpJVyx5Q0FBeUM7Ozs7O0lBQUUsdUNBQTRCOzs7OztJQUFFLG1DQUF5Qjs7OztJQXFJL0csa0JBQW1CO0lBQ25CLGdDQUFpQztJQUNqQyxlQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBSZW5kZXJlcjIsIE91dHB1dCwgSW5wdXQsRXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUmVjYXB0Y2hhRGF0YVNlcnZpY2UgfSBmcm9tICcuL3JlY2FwdGNoYS1kYXRhLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjb21tb24tcmVjYXB0Y2hhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVjYXB0Y2hhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yZWNhcHRjaGEuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoJ2FwaUJhc2VVcmwnKSBhcGlCYXNlVXJsOiBzdHJpbmc7XHJcbiAgQElucHV0KCdub25jZScpIG5vbmNlOiBzdHJpbmc7XHJcbiAgQElucHV0KCdwdWJsaWNLZXknKSBwdWJsaWNLZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2xhbmd1YWdlJykgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XHJcblxyXG4gIEBPdXRwdXQoKSBvblZhbGlkVG9rZW4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgZXJyb3JWZXJpZnlBbnN3ZXIgPSBudWxsO1xyXG4gIHN0YXRlOiBDQVBUQ0hBX1NUQVRFO1xyXG5cclxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBkYXRhU2VydmljZTogUmVjYXB0Y2hhRGF0YVNlcnZpY2UsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTp2b2lkIHtcclxuICAgIGxldCBzY3JpcHQgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XHJcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG4gICAgc2NyaXB0LnNyYyA9IFwiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzXCI7XHJcbiAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBzY3JpcHQpO1xyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZWQodG9rZW46c3RyaW5nKXtcclxuICAgIGNvbnNvbGUubG9nKHRva2VuKTtcclxuICAgIHRoaXMuc3RhdGUgPSBDQVBUQ0hBX1NUQVRFLlZFUklGWUlOR19UT0tFTjtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UudmVyaWZ5UmVjYXB0Y2hhKHRoaXMuYXBpQmFzZVVybCwgdGhpcy5ub25jZSwgdG9rZW4pLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQ6YW55ID0gcmVzcG9uc2UuYm9keTtcclxuICAgICAgaWYgKHRoaXMuaXNWYWxpZFBheWxvYWQocGF5bG9hZCkpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ0FQVENIQV9TVEFURS5TVUNDRVNTX1ZFUklGWV9BTlNXRVJfQ09SUkVDVDtcclxuICAgICAgICB0aGlzLm9uVmFsaWRUb2tlbi5lbWl0KHBheWxvYWQuand0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ0FQVENIQV9TVEFURS5FUlJPUl9WRVJJRlk7XHJcbiAgICAgICAgdGhpcy5lcnJvclZlcmlmeUFuc3dlciA9IHRoaXMuY3JlYXRlRXJyb3JUZXh0TGluZShyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FzZSB3aGVyZSBIVFRQIDIwMCByZXNwb25zZSBjb2RlIGlzIHJlY2VpdmVkIGJ5IHRoZSBwYXlsb2FkIGlzIGluY29ycmVjdCBvciBjb3JydXB0LlxyXG4gICAqIFRoZSBvY2N1cmFuY2Ugb2YgdGhpcyB0eXBlIG9mIGNhc2Ugc2hvdWxkIGJlIHJhcmUuXHJcbiAgICogQHBhcmFtIHBheWxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIGlzVmFsaWRQYXlsb2FkKHBheWxvYWQpIHtcclxuICAgIGlmICghcGF5bG9hZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdwYXlsb2FkIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBvciAwJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGhhc1ZhbGlkUHJvcCA9IHBheWxvYWQuaGFzT3duUHJvcGVydHkoJ3ZhbGlkJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiaGFzVmFsaWRQcm9wOlwiLCBoYXNWYWxpZFByb3ApXHJcbiAgICAgIGlmIChoYXNWYWxpZFByb3ApIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInBheWxvYWQudmFsaWQ6XCIsIHBheWxvYWQudmFsaWQpXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0eXBlb2YgcGF5bG9hZC52YWxpZDpcIiwgdHlwZW9mIHBheWxvYWQudmFsaWQpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaGFzVmFsaWRQcm9wIHx8IHBheWxvYWQudmFsaWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdmVyaWZ5aW5nIGNhcHRjaGEnKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXJyb3JUZXh0TGluZShlcnJvcikge1xyXG4gICAgbGV0IGxpbmUgPSAnRXJyb3Igc3RhdHVzOiAnICsgZXJyb3Iuc3RhdHVzO1xyXG4gICAgaWYgKGVycm9yLnN0YXR1c1RleHQpIHtcclxuICAgICAgbGluZSA9IGxpbmUgKyAnLCBzdGF0dXMgdGV4dDogJyArIGVycm9yLnN0YXR1c1RleHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICoqICAgIFRyYW5zbGF0ZWQgTWVzc2FnZXMgKipcclxuICAqKiAgICAqVVBEQVRFIFJFUVVJUkVEKiAgICoqXHJcbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICBwdWJsaWMgdHJhbnNsYXRlZE1lc3NhZ2VzID0ge1xyXG4gICAgcGxheUF1ZGlvOiB7XHJcbiAgICAgIGVuOiAnUGxheSBBdWRpbycsXHJcbiAgICAgIHpoOiAn5pKt5pS+5aOw6Z+zJyxcclxuICAgICAgZnI6ICdMZWN0dXJlIGF1ZGlvJyxcclxuICAgICAgcGE6ICfgqIbgqKHgqYDgqJMg4Kia4Kiy4Ki+4KiTJyxcclxuICAgIH0sXHJcbiAgICB0cnlBbm90aGVySW1nOiB7XHJcbiAgICAgIGVuOiAnVHJ5IGFub3RoZXIgaW1hZ2UnLFxyXG4gICAgICB6aDogJ+aNouS4quWbvuWDjycsXHJcbiAgICAgIGZyOiAnRXNzYXlleiB1bmUgYXV0cmUgaW1hZ2UnLFxyXG4gICAgICBwYTogJ+ColeCpi+CoiCDgqLngqYvgqLAg4Kia4Ki/4Kmx4Kik4KiwIOCoheConOCovOCoruCovuCokycsXHJcbiAgICB9LFxyXG4gICAgdXNlclByb21wdE1lc3NhZ2U6IHtcclxuICAgICAgZW46ICdFbnRlciB0aGUgdGV4dCB5b3UgZWl0aGVyIHNlZSBpbiB0aGUgYm94IG9yIHlvdSBoZWFyIGluIHRoZSBhdWRpbycsXHJcbiAgICAgIHpoOiAn6K+36L6T5YWl55yL5Yiw5oiW5ZCs5Yiw55qE5paH5a2XJyxcclxuICAgICAgZnI6ICdFbnRyZXogbGUgdGV4dGUgcXVlIHZvdXMgdm95ZXogZGFucyBsYSBjYXNlIG91IHF1ZSB2b3VzIGVudGVuZGV6IGRhbnMgbGUgc29uJyxcclxuICAgICAgcGE6ICfgqIngqLkg4Kif4KmI4KiV4Ki44KifIOCopuCovuColuCosiDgqJXgqLDgqYsg4Kic4KmLIOCopOCpgeCouOCpgOCogiDgqKzgqJXgqLjgqYcg4Ki14Ki/4Kmx4KiaIOCopuCph+ColuCopuCphyDgqLngqYsg4Kic4Ki+4KiCIOCopOCpgeCouOCpgOCogiDgqIbgqKHgqYDgqJMg4Ki14Ki/4Kmx4KiaIOCouOCpgeCoo+CopuCphyDgqLngqYsnLFxyXG4gICAgfSxcclxuICAgIGluY29ycmVjdEFuc3dlcjoge1xyXG4gICAgICBlbjogJ0luY29ycmVjdCBhbnN3ZXIsIHBsZWFzZSB0cnkgYWdhaW4uJyxcclxuICAgICAgemg6ICfnrZTmoYjkuI3lr7njgILor7fph43or5XjgIInLFxyXG4gICAgICBmcjogJ01hdXZhaXNlIHLDqXBvbnNlLCB2ZXVpbGxleiByw6llc3NheWVyLicsXHJcbiAgICAgIHBhOiAn4KiX4Kiy4KikIOConOCoteCovuCorCwg4KiV4Ki/4Kiw4Kiq4Ki+IOColeCosOColeCphyDgqKbgqYHgqKzgqL7gqLDgqL4g4KiV4KmL4Ki44Ki84Ki/4Ki44Ki8IOColeCosOCpiy4nLFxyXG4gICAgfSxcclxuICAgIHN1Y2Nlc3NNZXNzYWdlOiB7XHJcbiAgICAgIGVuOiAnWW91IGNhbiBzdWJtaXQgeW91ciBhcHBsaWNhdGlvbiBub3cuJyxcclxuICAgICAgemg6ICfkvaDnjrDlnKjlj6/ku6Xmj5DkuqTnlLPor7fkuobjgIInLFxyXG4gICAgICBmcjogJ1ZvdXMgcG91dmV6IHNvdW1ldHRyZSB2b3RyZSBjYW5kaWRhdHVyZSBtYWludGVuYW50LicsXHJcbiAgICAgIHBhOiAn4Kik4KmB4Ki44KmA4KiCIOCohuCoquCoo+CpgCDgqIXgqLDgqJzgqLzgqYAg4Ki54KmB4Kij4KmHIOCoquCph+CouOCovCDgqJXgqLAg4Ki44KiV4Kim4KmHIOCoueCpiycsXHJcbiAgICB9LFxyXG4gICAgY29ycmVjdDoge1xyXG4gICAgICBlbjogJ0NvcnJlY3QuJyxcclxuICAgICAgemg6ICfmraPnoa7jgIInLFxyXG4gICAgICBmcjogJ0NvcnJlY3QuJyxcclxuICAgICAgcGE6ICfgqLjgqLngqYAg4KiV4Kiw4KmLJyxcclxuICAgIH0sXHJcbiAgICBsb2FkaW5nSW1hZ2U6IHtcclxuICAgICAgZW46ICdMb2FkaW5nIENBUFRDSEEgaW1hZ2UnLFxyXG4gICAgICB6aDogJ+ato+WcqOS4i+i9vemqjOivgeeggScsXHJcbiAgICAgIGZyOiAnQ2hhcmdlbWVudCBkZSBsXFwnaW1hZ2UgQ0FQVENIQScsXHJcbiAgICAgIHBhOiAn4KiV4KmI4Kiq4Kif4Kia4Ki+IOComuCov+CpseCopOCosCDgqLLgqYvgqKEg4KiV4KiwIOCosOCov+CoueCoviDgqLngqYgnLFxyXG4gICAgfSxcclxuICAgIGJyb3dzZXJOb3RTdXBwb3J0QXVkaW86IHtcclxuICAgICAgZW46ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXVkaW8gZWxlbWVudC4nLFxyXG4gICAgICB6aDogJ+S9oOeahOa1j+iniOWZqOS4jeaUr+aMgeaSremfsycsXHJcbiAgICAgIGZyOiAnVm90cmUgbmF2aWdhdGV1ciBuZSBzdXBwb3J0ZSBwYXMgbFxcJ8OpbMOpbWVudCBhdWRpby4nLFxyXG4gICAgICBwYTogJ+CopOCpgeCoueCovuCooeCoviDgqKzgqY3gqLDgqL7gqIngqJzgqLzgqLAg4KiG4Kih4KmA4KiTIOCokOCosuCpgOCoruCpiOCoguConyDgqKbgqL4g4Ki44Kiu4Kiw4Kil4KioIOCoqOCoueCpgOCogiDgqJXgqLDgqKbgqL4uJyxcclxuICAgIH0sXHJcbiAgICB2ZXJpZnlpbmdBbnN3ZXI6IHtcclxuICAgICAgZW46ICdWZXJpZnlpbmcgeW91ciBhbnN3ZXIuLi4nLFxyXG4gICAgICB6aDogJ+ato+WcqOmqjOivgeetlOahiC4uLicsXHJcbiAgICAgIGZyOiAnVsOpcmlmaWNhdGlvbiBkZSB2b3RyZSByw6lwb25zZSAuLi4nLFxyXG4gICAgICBwYTogJ+CopOCpgeCoueCovuCooeCoviDgqJzgqLXgqL7gqKwg4Kik4Ki44Kim4KmA4KiVIOColeCosCDgqLDgqL/gqLngqL4g4Ki54KmIIC4uLicsXHJcbiAgICB9LFxyXG4gICAgZXJyb3JSZXRyaWV2aW5nSW1nOiB7XHJcbiAgICAgIGVuOiAnRXJyb3IgaGFwcGVuZWQgd2hpbGUgcmV0cmlldmluZyBDQVBUQ0hBIGltYWdlLiBQbGVhc2Uge3tDbGljayBIZXJlfX0gdG8gdHJ5IGFnYWluJyxcclxuICAgICAgemg6ICfpqozor4HnoIHkuIvovb3plJnor6/jgILor7d7e+eCueWHu+i/memHjH196YeN6K+VJyxcclxuICAgICAgZnI6ICdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZSBsXFwnaW1hZ2UgQ0FQVENIQS4gU1xcJ2lsIHZvdXMgcGxhw650IHt7Q2xpcXVleiBJY2l9fSBwb3VyIHLDqWVzc2F5ZXInLFxyXG4gICAgICBwYTogJ+ColeCpiOCoquCon+ComuCoviDgqJrgqL/gqbHgqKTgqLAg4Kio4KmC4KmwIOCoquCpjeCosOCovuCoquCopCDgqJXgqLDgqKbgqYcg4Ki44Kiu4KmH4KiCIOCopOCosOCpgeCpseCon+CpgCDgqIngqKTgqKrgqbDgqKgg4Ki54KmL4KiILiDgqJXgqL/gqLDgqKrgqL4g4KiV4Kiw4KiV4KmHIOCopuCpgeCorOCovuCosOCoviDgqJXgqYvgqLjgqLzgqL/gqLjgqLwg4KiV4Kiw4KioIOCosuCoiCB7e+Coh+CpseCopeCphyDgqJXgqLLgqL/gqJUg4KiV4Kiw4KmLfX0nLFxyXG4gICAgfSxcclxuICAgIGVycm9yVmVyaWZ5aW5nQW5zd2VyOiB7XHJcbiAgICAgIGVuOiAnRXJyb3IgaGFwcGVuZWQgd2hpbGUgdmVyaWZ5aW5nIHlvdXIgYW5zd2VyLiBQbGVhc2Uge3tDbGljayBIZXJlfX0gdG8gdHJ5IGFnYWluJyxcclxuICAgICAgemg6ICfpqozor4HnrZTmoYjov4fnqIvlj5HnlJ/plJnor6/jgILor7d7e+eCueWHu+i/memHjH196YeN6K+VJyxcclxuICAgICAgZnI6ICdVbmUgZXJyZXVyIHNcXCdlc3QgcHJvZHVpdGUgbG9ycyBkZSBsYSB2w6lyaWZpY2F0aW9uIGRlIHZvdHJlIHLDqXBvbnNlLiBTXFwnaWwgdm91cyBwbGHDrnQge3tDbGlxdWV6IEljaX19IHBvdXIgcsOpZXNzYXllcicsXHJcbiAgICAgIHBhOiAn4Kik4KmB4Ki54Ki+4Kih4Ki+IOConOCoteCovuCorCDgqKTgqLjgqKbgqYDgqJUg4KiV4Kiw4KioIOCoteCph+CosuCphyDgqJfgqLLgqKTgqYAg4KiG4KiIIOColeCov+CosOCoquCoviDgqJXgqLDgqJXgqYcg4Kim4KmB4Kis4Ki+4Kiw4Ki+IOColeCpi+CouOCovOCov+CouOCovCDgqJXgqLDgqKgg4Kiy4KiIIHt74KiH4Kmx4Kil4KmHIOColeCosuCov+ColSDgqJXgqLDgqYt9fScsXHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmVudW0gQ0FQVENIQV9TVEFURSB7XHJcbiAgVkVSSUZZSU5HX1RPS0VOID0gMSxcclxuICBTVUNDRVNTX1ZFUklGWV9BTlNXRVJfQ09SUkVDVCA9IDIsXHJcbiAgRVJST1JfVkVSSUZZID0gMyxcclxufVxyXG4iXX0=