UNPKG

angular-upcrop

Version:

Library with upload and crop feature for Angular 6+

159 lines (156 loc) 32.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter } from '@angular/core'; import { FileUploader } from 'ng2-file-upload'; export class UpcropUploadComponent { constructor() { this.config = {}; this.uploadQueue = []; this.onUploadQueue = new EventEmitter(); this.onUploadImage = new EventEmitter(); this.uploader = new FileUploader({}); this.hasFileOver = false; } /** * @return {?} */ ngOnInit() { // // Set uploader this.setUploader(); } /** * Set uploader * @return {?} */ setUploader() { /** @type {?} */ let self = this; // // Set uploader this.uploader.setOptions({ url: this.config.url, authToken: this.config.authToken, autoUpload: this.config.autoUpload, additionalParameter: this.config.additionalParameter }); // // After add file event this.uploader.onAfterAddingFile = (file) => { // // Set with credentials file.withCredentials = this.config.withCredentials; // // Emit onUploadQueue this.onUploadQueue.emit({ file: file }); }; // // On success item event this.uploader.onSuccessItem = (item, response, status, headers) => { if (status == 200) { /** @type {?} */ let data = JSON.parse(response); // // Emit onUploadQueue this.onUploadImage.emit({ data: data }); } else { } }; } /** * On file over event * @param {?} e * @return {?} */ onFileOver(e) { this.hasFileOver = e; } /** * Truncate filename * @param {?} n * @param {?} len * @return {?} */ truncate(n, len) { // // Validate if (!n) return n; /** @type {?} */ let ext = n.substring(n.lastIndexOf(".") + 1, n.length).toLowerCase(); /** @type {?} */ let filename = n.replace('.' + ext, ''); if (filename.length <= len) { return n; } filename = filename.substr(0, len) + (n.length > len ? '[...]' : ''); return filename + '.' + ext; } } UpcropUploadComponent.decorators = [ { type: Component, args: [{ selector: 'upcrop-upload', template: `<label ng2FileDrop multiple class="my-drop-zone" [ngClass]="{'nv-file-over': hasFileOver}" (fileOver)="onFileOver($event)" [uploader]="uploader" fxLayout fxLayoutAlign="center center"> Área de upload <input type="file" ng2FileSelect multiple [uploader]="uploader" style="display: none" /> </label> <!-- FILES --> <table class="table upcrop-upload-table"> <thead> <tr> <th>Preview</th> <th>Arquivo</th> <th style="width:30px; text-align: center"> <mat-icon class="is-pulled-right">settings</mat-icon> </th> </tr> </thead> <tbody> <tr *ngFor="let item of uploader.queue"> <td class="image-preview" style="width:100px"> <img upcropImagePreview [image]="item?._file" class="media-object" /> </td> <td>{{ truncate(item?.file?.name, 16) }}</td> <td class="actions" style="width:30px"> <button class="danger-btn" mat-icon-button color="warn" (click)="item.remove()"> <mat-icon>delete</mat-icon> </button> </td> </tr> <tr [hidden]="uploader.queue.length"> <td colspan="3" class="has-text-danger"> Nenhum arquivo, adicione acima. </td> </tr> </tbody> </table> `, styles: [`.my-drop-zone{border:2px dashed rgba(0,0,0,.04);width:100%;display:flex;padding:20px;background-color:rgba(0,0,0,.04);color:rgba(0,0,0,.7)}.nv-file-over{border:2px dashed rgba(244,67,54,.4)}[upcropImagePreview]{display:block}.upcrop-upload-table{background-color:#fff;color:#363636;border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.upcrop-upload-table td,.upcrop-upload-table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.upcrop-upload-table td.is-white,.upcrop-upload-table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.upcrop-upload-table td.is-black,.upcrop-upload-table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.upcrop-upload-table td.is-light,.upcrop-upload-table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.upcrop-upload-table td.is-dark,.upcrop-upload-table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.upcrop-upload-table td.is-primary,.upcrop-upload-table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.upcrop-upload-table td.is-info,.upcrop-upload-table th.is-info{background-color:#3273dc;border-color:#3273dc;color:#fff}.upcrop-upload-table td.is-success,.upcrop-upload-table th.is-success{background-color:#23d160;border-color:#23d160;color:#fff}.upcrop-upload-table td.is-warning,.upcrop-upload-table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.upcrop-upload-table td.is-danger,.upcrop-upload-table th.is-danger{background-color:#ff3860;border-color:#ff3860;color:#fff}.upcrop-upload-table td.is-narrow,.upcrop-upload-table th.is-narrow{white-space:nowrap;width:1%}.upcrop-upload-table th{color:#363636;text-align:left}.upcrop-upload-table tr:hover{background-color:#fafafa}.upcrop-upload-table tr.is-selected{background-color:#00d1b2;color:#fff}.upcrop-upload-table tr.is-selected a,.upcrop-upload-table tr.is-selected strong{color:currentColor}.upcrop-upload-table tr.is-selected td,.upcrop-upload-table tr.is-selected th{border-color:#fff;color:currentColor}.upcrop-upload-table tfoot td,.upcrop-upload-table tfoot th{border-width:2px 0 0;color:#363636}.upcrop-upload-table tbody tr:last-child td,.upcrop-upload-table tbody tr:last-child th{border-bottom-width:0}.upcrop-upload-table.is-bordered td,.upcrop-upload-table.is-bordered th{border-width:1px}.upcrop-upload-table.is-bordered tr:last-child td,.upcrop-upload-table.is-bordered tr:last-child th{border-bottom-width:1px}.upcrop-upload-table.is-fullwidth{width:100%}.upcrop-upload-table.is-narrow td,.upcrop-upload-table.is-narrow th{padding:.25em .5em}.upcrop-upload-table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.upcrop-upload-table.is-striped tbody tr:not(.is-selected):nth-child(even):hover{background-color:#f5f5f5}td,th{padding:0;text-align:left}.upcrop-upload-table-search{display:flex;padding:1.3em 1.6em}.upcrop-upload-table-search input{font-size:14px;flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1;border:none;background-color:transparent;outline:-webkit-focus-ring-color auto 0!important}.upcrop-upload-table-search>mat-icon{margin-right:16px;margin-top:2px}[table-loading]{position:absolute;width:100%;margin-top:59px!important;background-color:rgba(255,255,255,.9);height:calc(100% - 59px);z-index:1}[table-no-entries]{padding:1.6em}.mat-card[has-table]{padding:0}.mat-card[has-table] .mat-card-actions{padding:8px!important;margin:0;border-top:1px solid #dbdbdb;border-color:rgba(0,0,0,.09)}.mat-card[has-table] .mat-card-actions .mat-icon-button{color:rgba(0,0,0,.54)}.mat-card[has-table] .mat-card-actions .mat-icon-button[disabled]{color:rgba(0,0,0,.18)}.mat-card[has-table] .mat-card-actions .mat-paginator-page-size-label{margin:0 15px;color:rgba(0,0,0,.54);font-size:12px;font-weight:400}.upcrop-upload-table .actions .mat-icon-button{height:30px!important;width:30px;line-height:30px;flex-direction:column;box-sizing:border-box;display:flex;max-width:100%;place-content:center;align-items:center}.upcrop-upload-table .actions .mat-icon-button .mat-icon{font-size:18px;line-height:18px;width:18px;height:18px}.upcrop-upload-table thead tr{background-color:rgba(0,0,0,.04)!important}.upcrop-upload-table thead td:first-of-type,.upcrop-upload-table thead th:first-of-type{padding-left:1.8em}.upcrop-upload-table thead td:last-of-type,.upcrop-upload-table thead th:last-of-type{padding-right:1.8em}.upcrop-upload-table thead td mat-icon,.upcrop-upload-table thead th mat-icon{height:16px;width:16px;line-height:16px;font-size:16px;vertical-align:bottom;margin-right:3px}.upcrop-upload-table tbody td,.upcrop-upload-table tbody th{border-color:rgba(0,0,0,.04)}.upcrop-upload-table tbody td:first-of-type,.upcrop-upload-table tbody th:first-of-type{padding-left:1.6em}.upcrop-upload-table tbody td:last-of-type,.upcrop-upload-table tbody th:last-of-type{padding-right:1.6em}.upcrop-upload-table thead td,.upcrop-upload-table thead th{color:rgba(0,0,0,.54);font-size:12px;font-weight:400;padding:1.3em .75em;border:0}.upcrop-upload-table tbody td{color:rgba(0,0,0,.87);padding:1em .75em;font-size:.9rem;font-weight:400}@media (max-width:800px){.upcrop-upload-table{display:inline-block;vertical-align:top;max-width:100%;overflow-x:auto;white-space:nowrap;border-collapse:collapse;border-spacing:0;display:flex;overflow:hidden;background:0 0}.upcrop-upload-table .actions a{margin-top:-.35em}.upcrop-upload-table .is-pulled-right{float:none!important}.upcrop-upload-table thead{display:flex;flex-shrink:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.upcrop-upload-table thead td,.upcrop-upload-table thead th{padding:1.3em 1.8em;text-align:right;width:100%!important}.upcrop-upload-table thead td mat-icon,.upcrop-upload-table thead th mat-icon{margin-right:0}.upcrop-upload-table tbody{flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1;-webkit-overflow-scrolling:touch;background:radial-gradient(left,ellipse,rgba(0,0,0,.2) 0,transparent 75%) 0 center,radial-gradient(right,ellipse,rgba(0,0,0,.2) 0,transparent 75%) 100% center;background-size:10px 100%,10px 100%;background-attachment:scroll,scroll;background-repeat:no-repeat;display:flex;position:relative;overflow-x:auto;overflow-y:hidden;margin-right:1.6em}.upcrop-upload-table tbody tr{flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1}.upcrop-upload-table tbody td,.upcrop-upload-table tbody th{padding:1.155em 1.6em;text-align:left!important}.upcrop-upload-table tbody td:first-of-type,.upcrop-upload-table tbody th:first-of-type{padding-left:1.6em}.upcrop-upload-table tbody td:last-of-type,.upcrop-upload-table tbody th:last-of-type{padding-right:1.6em}.upcrop-upload-table tr{display:flex;flex-direction:column;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;flex-shrink:0}.upcrop-upload-table td,.upcrop-upload-table th{display:block;background-image:none!important;border-left:0}.upcrop-upload-table td:first-child,.upcrop-upload-table th:first-child{background-image:linear-gradient(to right,#fff 50%,rgba(255,255,255,0) 100%);background-repeat:no-repeat;background-size:20px 100%}.upcrop-upload-table td:last-child,.upcrop-upload-table th:last-child{background-image:linear-gradient(to left,#fff 50%,rgba(255,255,255,0) 100%);background-repeat:no-repeat;background-position:100% 0;background-size:20px 100%}.upcrop-upload-table td:not(:last-child),.upcrop-upload-table th:not(:last-child){border-bottom:0}}.upcrop-upload-table ::-webkit-scrollbar{height:8px;overflow:visible;width:16px}.upcrop-upload-table ::-webkit-scrollbar-button{height:0;width:0}.upcrop-upload-table ::-webkit-scrollbar-corner{background:0 0}.upcrop-upload-table ::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.upcrop-upload-table ::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}[enterlist] [has-table]{margin-right:-24px;margin-left:-24px}[enterlist] [has-table] .upcrop-upload-table{background-color:transparent}[enterlist] [has-table] .upcrop-upload-table thead tr{background-color:rgba(0,0,0,.02)!important}[enterlist] [has-table] .upcrop-upload-table tr:hover{background-color:inherit}.image-preview img{max-width:100%}`] },] }, ]; /** @nocollapse */ UpcropUploadComponent.ctorParameters = () => []; UpcropUploadComponent.propDecorators = { config: [{ type: Input }], uploadQueue: [{ type: Input }], onUploadQueue: [{ type: Output }], onUploadImage: [{ type: Output }] }; if (false) { /** @type {?} */ UpcropUploadComponent.prototype.config; /** @type {?} */ UpcropUploadComponent.prototype.uploadQueue; /** @type {?} */ UpcropUploadComponent.prototype.onUploadQueue; /** @type {?} */ UpcropUploadComponent.prototype.onUploadImage; /** @type {?} */ UpcropUploadComponent.prototype.uploader; /** @type {?} */ UpcropUploadComponent.prototype.hasFileOver; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXVwY3JvcC8iLCJzb3VyY2VzIjpbImxpYi91cGNyb3AtdXBsb2FkL3VwY3JvcC11cGxvYWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQW1DLE1BQU0saUJBQWlCLENBQUM7QUE0Q2hGLE1BQU07SUFVRjtzQkFSOEIsRUFBRTsyQkFDRyxFQUFFOzZCQUNKLElBQUksWUFBWSxFQUFFOzZCQUNsQixJQUFJLFlBQVksRUFBRTt3QkFFbkIsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDOzJCQUN0QixLQUFLO0tBRWxCOzs7O0lBRWpCLFFBQVE7OztRQUlKLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUN0Qjs7Ozs7SUFLRCxXQUFXOztRQUlQLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQzs7O1FBSWhCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7OztRQUkvSyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7OztZQUl2QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDOzs7WUFJbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLElBQUksRUFBRSxJQUFJO2FBQ2IsQ0FBQyxDQUFDO1NBQ04sQ0FBQzs7O1FBSUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFjLEVBQUUsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsT0FBOEIsRUFBRSxFQUFFO1lBRS9HLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDOztnQkFJaEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O2dCQUloQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztvQkFDcEIsSUFBSSxFQUFFLElBQUk7aUJBQ2IsQ0FBQyxDQUFDO2FBQ047WUFBQyxJQUFJLENBQUMsQ0FBQzthQUNQO1NBQ0osQ0FBQztLQUNMOzs7Ozs7SUFNTSxVQUFVLENBQUMsQ0FBTTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7SUFRekIsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHOzs7UUFJWCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7O1FBRWpCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDOztRQUN0RSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUMvQjs7O1lBdklKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBcUNiO2dCQUNHLE1BQU0sRUFBRSxDQUFDLHl3UUFBeXdRLENBQUM7YUFDdHhROzs7OztxQkFHSSxLQUFLOzBCQUNMLEtBQUs7NEJBQ0wsTUFBTTs0QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlSXRlbSwgUGFyc2VkUmVzcG9uc2VIZWFkZXJzIH0gZnJvbSAnbmcyLWZpbGUtdXBsb2FkJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGNyb3AtdXBsb2FkJyxcbiAgICB0ZW1wbGF0ZTogYDxsYWJlbCBuZzJGaWxlRHJvcCBtdWx0aXBsZSBjbGFzcz1cIm15LWRyb3Atem9uZVwiIFtuZ0NsYXNzXT1cInsnbnYtZmlsZS1vdmVyJzogaGFzRmlsZU92ZXJ9XCIgKGZpbGVPdmVyKT1cIm9uRmlsZU92ZXIoJGV2ZW50KVwiXG4gICAgW3VwbG9hZGVyXT1cInVwbG9hZGVyXCIgZnhMYXlvdXQgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cbiAgICDDgXJlYSBkZSB1cGxvYWRcbiAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBuZzJGaWxlU2VsZWN0IG11bHRpcGxlIFt1cGxvYWRlcl09XCJ1cGxvYWRlclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIC8+XG48L2xhYmVsPlxuXG48IS0tIEZJTEVTIC0tPlxuPHRhYmxlIGNsYXNzPVwidGFibGUgdXBjcm9wLXVwbG9hZC10YWJsZVwiPlxuICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPlByZXZpZXc8L3RoPlxuICAgICAgICAgICAgPHRoPkFycXVpdm88L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MzBweDsgdGV4dC1hbGlnbjogY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaXMtcHVsbGVkLXJpZ2h0XCI+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuXG4gICAgPHRib2R5PlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdXBsb2FkZXIucXVldWVcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImltYWdlLXByZXZpZXdcIiBzdHlsZT1cIndpZHRoOjEwMHB4XCI+XG4gICAgICAgICAgICAgICAgPGltZyB1cGNyb3BJbWFnZVByZXZpZXcgW2ltYWdlXT1cIml0ZW0/Ll9maWxlXCIgY2xhc3M9XCJtZWRpYS1vYmplY3RcIiAvPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB0cnVuY2F0ZShpdGVtPy5maWxlPy5uYW1lLCAxNikgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uc1wiIHN0eWxlPVwid2lkdGg6MzBweFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkYW5nZXItYnRuXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwid2FyblwiIChjbGljayk9XCJpdGVtLnJlbW92ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIFtoaWRkZW5dPVwidXBsb2FkZXIucXVldWUubGVuZ3RoXCI+XG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgIE5lbmh1bSBhcnF1aXZvLCBhZGljaW9uZSBhY2ltYS5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG5gLFxuICAgIHN0eWxlczogW2AubXktZHJvcC16b25le2JvcmRlcjoycHggZGFzaGVkIHJnYmEoMCwwLDAsLjA0KTt3aWR0aDoxMDAlO2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjIwcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6cmdiYSgwLDAsMCwuNyl9Lm52LWZpbGUtb3Zlcntib3JkZXI6MnB4IGRhc2hlZCByZ2JhKDI0NCw2Nyw1NCwuNCl9W3VwY3JvcEltYWdlUHJldmlld117ZGlzcGxheTpibG9ja30udXBjcm9wLXVwbG9hZC10YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzM2MzYzNjtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MH0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0aHtib3JkZXI6MXB4IHNvbGlkICNkYmRiZGI7Ym9yZGVyLXdpZHRoOjAgMCAxcHg7cGFkZGluZzouNWVtIC43NWVtO3ZlcnRpY2FsLWFsaWduOnRvcH0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy13aGl0ZSwudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy13aGl0ZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNmZmY7Y29sb3I6IzBhMGEwYX0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1ibGFjaywudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1ibGFja3tiYWNrZ3JvdW5kLWNvbG9yOiMwYTBhMGE7Ym9yZGVyLWNvbG9yOiMwYTBhMGE7Y29sb3I6I2ZmZn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1saWdodCwudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1saWdodHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWNvbG9yOiNmNWY1ZjU7Y29sb3I6IzM2MzYzNn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1kYXJrLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoLmlzLWRhcmt7YmFja2dyb3VuZC1jb2xvcjojMzYzNjM2O2JvcmRlci1jb2xvcjojMzYzNjM2O2NvbG9yOiNmNWY1ZjV9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtcHJpbWFyeSwudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6IzAwZDFiMjtib3JkZXItY29sb3I6IzAwZDFiMjtjb2xvcjojZmZmfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkLmlzLWluZm8sLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiMzMjczZGM7Ym9yZGVyLWNvbG9yOiMzMjczZGM7Y29sb3I6I2ZmZn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1zdWNjZXNzLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoLmlzLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojMjNkMTYwO2JvcmRlci1jb2xvcjojMjNkMTYwO2NvbG9yOiNmZmZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtd2FybmluZywudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy13YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2ZmZGQ1Nztib3JkZXItY29sb3I6I2ZmZGQ1Nztjb2xvcjpyZ2JhKDAsMCwwLC43KX0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1kYW5nZXIsLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2ZmMzg2MDtib3JkZXItY29sb3I6I2ZmMzg2MDtjb2xvcjojZmZmfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkLmlzLW5hcnJvdywudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1uYXJyb3d7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjElfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoe2NvbG9yOiMzNjM2MzY7dGV4dC1hbGlnbjpsZWZ0fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0udXBjcm9wLXVwbG9hZC10YWJsZSB0ci5pcy1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwMGQxYjI7Y29sb3I6I2ZmZn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ci5pcy1zZWxlY3RlZCBhLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRyLmlzLXNlbGVjdGVkIHN0cm9uZ3tjb2xvcjpjdXJyZW50Q29sb3J9LnVwY3JvcC11cGxvYWQtdGFibGUgdHIuaXMtc2VsZWN0ZWQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdHIuaXMtc2VsZWN0ZWQgdGh7Ym9yZGVyLWNvbG9yOiNmZmY7Y29sb3I6Y3VycmVudENvbG9yfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRmb290IHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRmb290IHRoe2JvcmRlci13aWR0aDoycHggMCAwO2NvbG9yOiMzNjM2MzZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0cjpsYXN0LWNoaWxkIHRoe2JvcmRlci1ib3R0b20td2lkdGg6MH0udXBjcm9wLXVwbG9hZC10YWJsZS5pcy1ib3JkZXJlZCB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZS5pcy1ib3JkZXJlZCB0aHtib3JkZXItd2lkdGg6MXB4fS51cGNyb3AtdXBsb2FkLXRhYmxlLmlzLWJvcmRlcmVkIHRyOmxhc3QtY2hpbGQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUuaXMtYm9yZGVyZWQgdHI6bGFzdC1jaGlsZCB0aHtib3JkZXItYm90dG9tLXdpZHRoOjFweH0udXBjcm9wLXVwbG9hZC10YWJsZS5pcy1mdWxsd2lkdGh7d2lkdGg6MTAwJX0udXBjcm9wLXVwbG9hZC10YWJsZS5pcy1uYXJyb3cgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUuaXMtbmFycm93IHRoe3BhZGRpbmc6LjI1ZW0gLjVlbX0udXBjcm9wLXVwbG9hZC10YWJsZS5pcy1zdHJpcGVkIHRib2R5IHRyOm5vdCguaXMtc2VsZWN0ZWQpOm50aC1jaGlsZChldmVuKXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9LnVwY3JvcC11cGxvYWQtdGFibGUuaXMtc3RyaXBlZCB0Ym9keSB0cjpub3QoLmlzLXNlbGVjdGVkKTpudGgtY2hpbGQoZXZlbik6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fXRkLHRoe3BhZGRpbmc6MDt0ZXh0LWFsaWduOmxlZnR9LnVwY3JvcC11cGxvYWQtdGFibGUtc2VhcmNoe2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjEuM2VtIDEuNmVtfS51cGNyb3AtdXBsb2FkLXRhYmxlLXNlYXJjaCBpbnB1dHtmb250LXNpemU6MTRweDtmbGV4OjEgMSAxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1mbGV4OjE7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtvdXRsaW5lOi13ZWJraXQtZm9jdXMtcmluZy1jb2xvciBhdXRvIDAhaW1wb3J0YW50fS51cGNyb3AtdXBsb2FkLXRhYmxlLXNlYXJjaD5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDttYXJnaW4tdG9wOjJweH1bdGFibGUtbG9hZGluZ117cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTttYXJnaW4tdG9wOjU5cHghaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSk7aGVpZ2h0OmNhbGMoMTAwJSAtIDU5cHgpO3otaW5kZXg6MX1bdGFibGUtbm8tZW50cmllc117cGFkZGluZzoxLjZlbX0ubWF0LWNhcmRbaGFzLXRhYmxlXXtwYWRkaW5nOjB9Lm1hdC1jYXJkW2hhcy10YWJsZV0gLm1hdC1jYXJkLWFjdGlvbnN7cGFkZGluZzo4cHghaW1wb3J0YW50O21hcmdpbjowO2JvcmRlci10b3A6MXB4IHNvbGlkICNkYmRiZGI7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjA5KX0ubWF0LWNhcmRbaGFzLXRhYmxlXSAubWF0LWNhcmQtYWN0aW9ucyAubWF0LWljb24tYnV0dG9ue2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhcmRbaGFzLXRhYmxlXSAubWF0LWNhcmQtYWN0aW9ucyAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXXtjb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYXJkW2hhcy10YWJsZV0gLm1hdC1jYXJkLWFjdGlvbnMgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVse21hcmdpbjowIDE1cHg7Y29sb3I6cmdiYSgwLDAsMCwuNTQpO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjQwMH0udXBjcm9wLXVwbG9hZC10YWJsZSAuYWN0aW9ucyAubWF0LWljb24tYnV0dG9ue2hlaWdodDozMHB4IWltcG9ydGFudDt3aWR0aDozMHB4O2xpbmUtaGVpZ2h0OjMwcHg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7cGxhY2UtY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS51cGNyb3AtdXBsb2FkLXRhYmxlIC5hY3Rpb25zIC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweH0udXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZCB0cntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KSFpbXBvcnRhbnR9LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGQ6Zmlyc3Qtb2YtdHlwZSwudXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZCB0aDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoxLjhlbX0udXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZCB0ZDpsYXN0LW9mLXR5cGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGg6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MS44ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGQgbWF0LWljb24sLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGggbWF0LWljb257aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDtsaW5lLWhlaWdodDoxNnB4O2ZvbnQtc2l6ZToxNnB4O3ZlcnRpY2FsLWFsaWduOmJvdHRvbTttYXJnaW4tcmlnaHQ6M3B4fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRoe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9LnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGQ6Zmlyc3Qtb2YtdHlwZSwudXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0aDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoxLjZlbX0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0ZDpsYXN0LW9mLXR5cGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGg6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MS42ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGh7Y29sb3I6cmdiYSgwLDAsMCwuNTQpO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjQwMDtwYWRkaW5nOjEuM2VtIC43NWVtO2JvcmRlcjowfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRke2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtwYWRkaW5nOjFlbSAuNzVlbTtmb250LXNpemU6LjlyZW07Zm9udC13ZWlnaHQ6NDAwfUBtZWRpYSAobWF4LXdpZHRoOjgwMHB4KXsudXBjcm9wLXVwbG9hZC10YWJsZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQ6MCAwfS51cGNyb3AtdXBsb2FkLXRhYmxlIC5hY3Rpb25zIGF7bWFyZ2luLXRvcDotLjM1ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgLmlzLXB1bGxlZC1yaWdodHtmbG9hdDpub25lIWltcG9ydGFudH0udXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZHtkaXNwbGF5OmZsZXg7ZmxleC1zaHJpbms6MDttaW4td2lkdGg6LXdlYmtpdC1taW4tY29udGVudDttaW4td2lkdGg6LW1vei1taW4tY29udGVudDttaW4td2lkdGg6bWluLWNvbnRlbnR9LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGh7cGFkZGluZzoxLjNlbSAxLjhlbTt0ZXh0LWFsaWduOnJpZ2h0O3dpZHRoOjEwMCUhaW1wb3J0YW50fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRkIG1hdC1pY29uLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRoIG1hdC1pY29ue21hcmdpbi1yaWdodDowfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5e2ZsZXg6MSAxIDEwMCU7Ym94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LWZsZXg6MTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtiYWNrZ3JvdW5kOnJhZGlhbC1ncmFkaWVudChsZWZ0LGVsbGlwc2UscmdiYSgwLDAsMCwuMikgMCx0cmFuc3BhcmVudCA3NSUpIDAgY2VudGVyLHJhZGlhbC1ncmFkaWVudChyaWdodCxlbGxpcHNlLHJnYmEoMCwwLDAsLjIpIDAsdHJhbnNwYXJlbnQgNzUlKSAxMDAlIGNlbnRlcjtiYWNrZ3JvdW5kLXNpemU6MTBweCAxMDAlLDEwcHggMTAwJTtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6c2Nyb2xsLHNjcm9sbDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93LXg6YXV0bztvdmVyZmxvdy15OmhpZGRlbjttYXJnaW4tcmlnaHQ6MS42ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdHJ7ZmxleDoxIDEgMTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtZmxleDoxfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRoe3BhZGRpbmc6MS4xNTVlbSAxLjZlbTt0ZXh0LWFsaWduOmxlZnQhaW1wb3J0YW50fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRkOmZpcnN0LW9mLXR5cGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGg6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MS42ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGQ6bGFzdC1vZi10eXBlLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRoOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjEuNmVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOi13ZWJraXQtbWluLWNvbnRlbnQ7bWluLXdpZHRoOi1tb3otbWluLWNvbnRlbnQ7bWluLXdpZHRoOm1pbi1jb250ZW50O2ZsZXgtc2hyaW5rOjB9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGh7ZGlzcGxheTpibG9jaztiYWNrZ3JvdW5kLWltYWdlOm5vbmUhaW1wb3J0YW50O2JvcmRlci1sZWZ0OjB9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQ6Zmlyc3QtY2hpbGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGg6Zmlyc3QtY2hpbGR7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsI2ZmZiA1MCUscmdiYSgyNTUsMjU1LDI1NSwwKSAxMDAlKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjIwcHggMTAwJX0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZDpsYXN0LWNoaWxkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoOmxhc3QtY2hpbGR7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwjZmZmIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDApIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjEwMCUgMDtiYWNrZ3JvdW5kLXNpemU6MjBweCAxMDAlfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkOm5vdCg6bGFzdC1jaGlsZCksLnVwY3JvcC11cGxvYWQtdGFibGUgdGg6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tOjB9fS51cGNyb3AtdXBsb2FkLXRhYmxlIDo6LXdlYmtpdC1zY3JvbGxiYXJ7aGVpZ2h0OjhweDtvdmVyZmxvdzp2aXNpYmxlO3dpZHRoOjE2cHh9LnVwY3JvcC11cGxvYWQtdGFibGUgOjotd2Via2l0LXNjcm9sbGJhci1idXR0b257aGVpZ2h0OjA7d2lkdGg6MH0udXBjcm9wLXVwbG9hZC10YWJsZSA6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lcntiYWNrZ3JvdW5kOjAgMH0udXBjcm9wLXVwbG9hZC10YWJsZSA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMik7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjpzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6MXB4IDFweCAxcHggNnB4O21pbi1oZWlnaHQ6MjhweDtwYWRkaW5nOjEwMHB4IDAgMDtib3gtc2hhZG93Omluc2V0IDFweCAxcHggMCByZ2JhKDAsMCwwLC4xKSxpbnNldCAwIC0xcHggMCByZ2JhKDAsMCwwLC4wNyl9LnVwY3JvcC11cGxvYWQtdGFibGUgOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOnNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDowIDAgMCA0cHh9W2VudGVybGlzdF0gW2hhcy10YWJsZV17bWFyZ2luLXJpZ2h0Oi0yNHB4O21hcmdpbi1sZWZ0Oi0yNHB4fVtlbnRlcmxpc3RdIFtoYXMtdGFibGVdIC51cGNyb3AtdXBsb2FkLXRhYmxle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9W2VudGVybGlzdF0gW2hhcy10YWJsZV0gLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdHJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMikhaW1wb3J0YW50fVtlbnRlcmxpc3RdIFtoYXMtdGFibGVdIC51cGNyb3AtdXBsb2FkLXRhYmxlIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6aW5oZXJpdH0uaW1hZ2UtcHJldmlldyBpbWd7bWF4LXdpZHRoOjEwMCV9YF1cbn0pXG5leHBvcnQgY2xhc3MgVXBjcm9wVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IGFueSA9IHt9O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1cGxvYWRRdWV1ZTogYW55ID0gW107XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblVwbG9hZFF1ZXVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25VcGxvYWRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyB1cGxvYWRlcjogRmlsZVVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcih7fSk7XG4gICAgcHVibGljIGhhc0ZpbGVPdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2V0IHVwbG9hZGVyXG4gICAgICAgIHRoaXMuc2V0VXBsb2FkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXBsb2FkZXJcbiAgICAgKi9cbiAgICBzZXRVcGxvYWRlcigpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDb250ZXh0IGZvciB1cGxvYWRlclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2V0IHVwbG9hZGVyXG4gICAgICAgIHRoaXMudXBsb2FkZXIuc2V0T3B0aW9ucyh7IHVybDogdGhpcy5jb25maWcudXJsLCBhdXRoVG9rZW46IHRoaXMuY29uZmlnLmF1dGhUb2tlbiwgYXV0b1VwbG9hZDogdGhpcy5jb25maWcuYXV0b1VwbG9hZCwgYWRkaXRpb25hbFBhcmFtZXRlcjogdGhpcy5jb25maWcuYWRkaXRpb25hbFBhcmFtZXRlciB9KTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBBZnRlciBhZGQgZmlsZSBldmVudFxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uQWZ0ZXJBZGRpbmdGaWxlID0gKGZpbGUpID0+IHtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFNldCB3aXRoIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICBmaWxlLndpdGhDcmVkZW50aWFscyA9IHRoaXMuY29uZmlnLndpdGhDcmVkZW50aWFscztcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEVtaXQgb25VcGxvYWRRdWV1ZVxuICAgICAgICAgICAgdGhpcy5vblVwbG9hZFF1ZXVlLmVtaXQoe1xuICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIHN1Y2Nlc3MgaXRlbSBldmVudFxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uU3VjY2Vzc0l0ZW0gPSAoaXRlbTogRmlsZUl0ZW0sIHJlc3BvbnNlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCBoZWFkZXJzOiBQYXJzZWRSZXNwb25zZUhlYWRlcnMpID0+IHtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAyMDApIHtcblxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBFbWl0IG9uVXBsb2FkUXVldWVcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBsb2FkSW1hZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZmlsZSBvdmVyIGV2ZW50XG4gICAgICogQHBhcmFtIGVcbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWxlT3ZlcihlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNGaWxlT3ZlciA9IGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGUgZmlsZW5hbWVcbiAgICAgKiBAcGFyYW0gblxuICAgICAqIEBwYXJhbSBsZW5cbiAgICAgKi9cbiAgICB0cnVuY2F0ZShuLCBsZW4pIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZVxuICAgICAgICBpZiAoIW4pIHJldHVybiBuO1xuXG4gICAgICAgIGxldCBleHQgPSBuLnN1YnN0cmluZyhuLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsIG4ubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZmlsZW5hbWUgPSBuLnJlcGxhY2UoJy4nICsgZXh0LCAnJyk7XG4gICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGggPD0gbGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBsZW4pICsgKG4ubGVuZ3RoID4gbGVuID8gJ1suLi5dJyA6ICcnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVuYW1lICsgJy4nICsgZXh0O1xuICAgIH1cbn1cbiJdfQ==