@hxui/angular
Version:
* * *
493 lines • 63.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Input, forwardRef, Component, ViewChild, Output, EventEmitter, IterableDiffers, ViewEncapsulation, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import * as _ from 'lodash';
import { SelectizeConfig } from './selectize.config';
/** @type {?} */
export const SELECTIZE_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SelectizeComponent),
multi: true
};
export class SelectizeComponent {
/**
* @param {?} _differs
* @param {?} renderer
*/
constructor(_differs, renderer) {
this._differs = _differs;
this.renderer = renderer;
this.enabled = true;
this.value = [];
this.isFocused = false;
this.isValid = false;
this.onBlur = new EventEmitter(false);
this.onFocus = new EventEmitter(false);
/**
* Invoked anytime a key is pressed down on the selectize search field
* @param e
*/
this.onKeydown = e => {
console.log(e);
/** @type {?} */
const TABKEY = 9;
if (e.keyCode === TABKEY) {
e.preventDefault();
e.stopImmediatePropagation();
e.stopPropagation();
}
};
}
/**
* @return {?}
*/
ngOnInit() {
if (this.id && this.id.length > 0) {
this.renderer.setAttribute(this.selectizeInput.nativeElement, 'id', this.id);
}
this.reset();
}
/**
* @return {?}
*/
reset() {
this.selectize = $(this.selectizeInput.nativeElement).selectize(this.config)[0].selectize;
this.selectize.on('change', this.onSelectizeValueChange.bind(this));
this.selectize.on('blur', this.onBlurEvent.bind(this));
this.selectize.on('focus', this.onFocusEvent.bind(this));
this.selectize.on('type', this.onSelectizeType.bind(this));
this.selectize.on('item_add', this.onSelectizeItemSelected.bind(this));
this.updatePlaceholder();
this.onEnabledStatusChange();
this.hasCaret();
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.selectize) {
this.selectize.off('change');
this.selectize.off('blur');
this.selectize.off('focus');
this.selectize.off('type');
}
}
/**
* Change detection for primitive types.
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.selectize) {
if (changes.hasOwnProperty('placeholder') ||
changes.hasOwnProperty('hasOptionsPlaceholder') ||
changes.hasOwnProperty('noOptionsPlaceholder')) {
this.updatePlaceholder();
}
if (changes.hasOwnProperty('enabled')) {
this.onEnabledStatusChange();
}
}
}
/**
* Implementing deep check for option comparison
*
* FIXME -> Implement deep check to only compare against label and value fields.
* @return {?}
*/
ngDoCheck() {
if (this._options_differ) {
/** @type {?} */
const changes = this._options_differ.diff(this._options);
if (changes) {
this._applyOptionsChanges(changes);
}
}
if (this._optgroups_differ) {
/** @type {?} */
const changes = this._optgroups_differ.diff(this._optgroups);
if (changes) {
this._applyOptionGroupChanges(changes);
}
}
}
/**
* @param {?} changes
* @return {?}
*/
_applyOptionsChanges(changes) {
changes.forEachRemovedItem((record) => {
this.onSelectizeOptionRemove(record.item);
});
changes.forEachAddedItem((record) => {
this.onSelectizeOptionAdd(record.item);
});
this.updatePlaceholder();
this.evalHasError();
}
/**
* @param {?} changes
* @return {?}
*/
_applyOptionGroupChanges(changes) {
changes.forEachRemovedItem((record) => {
this.onSelectizeOptGroupRemove(record.item);
});
changes.forEachAddedItem((record) => {
this.onSelectizeOptGroupAdd(record.item);
});
this.updatePlaceholder();
this.evalHasError();
}
/**
* @return {?}
*/
clearhighlight() {
// remove highlight to help selectize bug
// https://github.com/selectize/selectize.js/issues/1141
this.selectize.$dropdown_content.removeHighlight();
}
/**
* @return {?}
*/
onBlurEvent() {
if (this.formControl) {
this.formControl.markAsTouched();
}
this.onBlur.emit();
this.evalHasError();
this.isFocused = false;
this.isValid = (this.selectize.getValue().length > 0);
}
/**
* @return {?}
*/
onFocusEvent() {
if (this.formControl) {
this.formControl.markAsTouched();
}
this.onFocus.emit();
this.evalHasError();
this.isFocused = true;
}
/**
* @param {?} optgroup
* @return {?}
*/
onSelectizeOptGroupAdd(optgroup) {
this.selectize.addOptionGroup(optgroup[this.getOptgroupField()], optgroup);
}
/**
* @param {?} optgroup
* @return {?}
*/
onSelectizeOptGroupRemove(optgroup) {
this.selectize.removeOptionGroup(optgroup[this.getOptgroupField()]);
}
/**
* Refresh selected values when options change.
* @param {?} option
* @return {?}
*/
onSelectizeOptionAdd(option) {
this.selectize.addOption(_.cloneDeep(option));
/** @type {?} */
const valueField = this.config.valueField;
if (this.value) {
/** @type {?} */
const items = typeof this.value === 'string' || typeof this.value === 'number'
? [this.value]
: this.value;
if (items &&
items instanceof Array &&
items.find(value => value === option[valueField])) {
this.selectize.addItem(option[valueField], true);
}
}
}
/**
* @param {?} option
* @return {?}
*/
onSelectizeOptionRemove(option) {
this.selectize.removeOption(option[this.config.valueField]);
}
/**
* @return {?}
*/
evalHasError() {
/** @type {?} */
const parent = $(this.selectize.$control).parent();
if (this.formControl) {
if (this.formControl.touched && this.formControl.invalid) {
parent.addClass(this.errorClass || 'has-error');
}
else if (parent.hasClass('has-error')) {
parent.removeClass(this.errorClass || 'has-error');
}
}
}
/**
* @return {?}
*/
updateLabel() {
}
/**
* Update the current placeholder based on the given input parameter.
* @return {?}
*/
updatePlaceholder() {
if (this.selectize.items.length === 0 &&
this.selectize.settings.placeholder !== this.getPlaceholder()) {
this.selectize.settings.placeholder = this.getPlaceholder();
this.selectize.updatePlaceholder();
this.selectize.showInput(); // Without this, when options are cleared placeholder only appears after focus.
}
}
/**
* Called when a change is detected in the 'enabled' input field.
* Sets the selectize state based on the new value.
* @return {?}
*/
onEnabledStatusChange() {
this.enabled ? this.selectize.enable() : this.selectize.disable();
}
/**
* @return {?}
*/
hasCaret() {
if (this.config.hasCaret) {
/** @type {?} */
const parent = $(this.selectize.$control).parent();
parent.addClass('hasCaret');
}
}
/**
* Dispatches change event when a value change is detected.
* @param {?} $event
* @return {?}
*/
onSelectizeValueChange($event) {
// In some cases this gets called before registerOnChange.
if (this.onChangeCallback) {
// Map selectize's value collection back to original ISelectizeItem object
/** @type {?} */
const data = this.selectize.items.map(v => {
return this.selectize.options[v];
});
this.onChangeCallback(data);
}
}
/**
* Invoked when the user types while filtering options.
* @param {?} str
* @return {?}
*/
onSelectizeType(str) {
if (str.length === 0) {
this.clearhighlight();
this.selectize.close();
}
}
/**
* @param {?} $event
* @return {?}
*/
onSelectizeItemSelected($event) {
this.clearhighlight();
if (this.config.closeAfterSelect) {
this.selectize.close();
}
}
/**
* Returns the applicable placeholder.
* @return {?}
*/
getPlaceholder() {
if (this.hasOptionsPlaceholder) {
if (this.options && this.options.length > 0) {
return this.hasOptionsPlaceholder;
}
}
if (this.noOptionsPlaceholder) {
if (!this.options || this.options.length === 0) {
return this.noOptionsPlaceholder;
}
}
return this.placeholder;
}
/**
* Implementation from ControlValueAccessor
*
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
if (obj === this.value) {
return;
}
this.value = obj;
if (!obj || obj.length === 0) {
this.selectize.setValue('');
return;
}
/** @type {?} */
const stringValue = obj.map(v => {
if (!Object.keys(this.selectize.options).some(x => x === v.value)) {
this.selectize.addOption(v);
}
return v.value;
});
this.selectize.setValue(stringValue);
this.evalHasError();
this.isValid = (this.selectize.getValue().length > 0);
}
/**
* Implementation from ControlValueAccessor, callback for (ngModelChange)
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
/**
* Implementation from ControlValueAccessor
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* @return {?}
*/
getOptgroupField() {
return this.config['optgroupField']
? this.config['optgroupField']
: 'optgroup';
}
/**
* @param {?} value
* @return {?}
*/
set options(value) {
this._options = value;
if (!this._options_differ && value) {
this._options_differ = this._differs.find(value).create();
}
}
/**
* @return {?}
*/
get options() {
return this._options;
}
/**
* @param {?} value
* @return {?}
*/
set optgroups(value) {
this._optgroups = value;
if (!this._optgroups_differ && value) {
this._optgroups_differ = this._differs.find(value).create();
}
}
/**
* @return {?}
*/
get optgroups() {
return this._optgroups;
}
}
SelectizeComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-selectize',
template: `<div class="hx-input-control" [ngClass]="config.inputControlClasses" [class.is-focused]="isFocused" [class.is-valid]="isValid">
<select #selectizeInput></select>
<label for="{{id}}" class="hx-label">{{config.label}} <sup *ngIf="config.mandatory">*</sup></label>
<div class="hx-help">{{config.help}}</div>
</div>`,
providers: [SELECTIZE_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None,
styles: [`.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#2a2c2d;font-family:inherit;font-size:.92rem;line-height:1.5;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:0 0;cursor:text;display:inline-block}.selectize-input{border:1px solid rgba(0,0,0,.2);padding:8px 0;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:0;border-width:0 0 1px}.selectize-control.multi .selectize-input.has-items{padding:6px 0 3px}.selectize-control.multi.hasCaret .selectize-input.has-items{padding-right:1rem}.selectize-input.full{background-color:transparent}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{box-shadow:none}.selectize-input.dropdown-active{border-radius:0}.selectize-input>*{vertical-align:baseline;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:4px;padding:2px 6px;background:rgba(0,0,0,.05);color:#2a2c2d;border:0 solid transparent;border-radius:290486px;font-size:.75rem;justify-content:center;line-height:1.5;white-space:nowrap}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#2a2c2d;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#787878;background:rgba(77,77,77,.05);border:0 solid rgba(77,77,77,0)}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:0!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.hx-select-control:after{display:none}.selectize-dropdown{position:absolute;z-index:10;border:transparent;background:#fff;margin:1px 0 0;border-top:0;box-sizing:border-box;box-shadow:0 6px 12px rgba(0,0,0,.145);border-radius:0}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(35,49,43,.23);border-radius:1px;font-weight:700}.selectize-dropdown .optgroup-header,.selectize-dropdown [data-selectable]{padding:5px 8px}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0}.selectize-dropdown .optgroup-header{color:#2a2c2d;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#41b987;color:#fff}.selectize-dropdown .active.create{color:#fff}.selectize-dropdown .create{color:rgba(42,44,45,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.hasCaret .selectize-input,.selectize-control.hasCaret .selectize-input input,.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.hasCaret .selectize-input.input-active,.selectize-control.hasCaret .selectize-input.input-active input,.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.hasCaret .selectize-input:after,.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:grey transparent transparent}.selectize-control.hasCaret .selectize-input.dropdown-active:after,.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.multi.hasCaret .selectize-input.has-items:after{top:initial;bottom:1.3rem}.selectize-control.rtl.hasCaret .selectize-input:after,.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}hxa-selectize .hx-input-control{padding-top:.21rem}hxa-selectize .hx-input-control .hx-label{position:absolute;top:.7rem;margin:0;font-weight:400;color:#aeadad;left:0;transition:.3s;z-index:0}hxa-selectize .hx-input-control .hx-label sup{top:-.2rem;color:#b81e4f;font-size:.7rem;transition:.3s}hxa-selectize .hx-input-control .hx-label+.hx-help{font-size:.75rem;margin-top:-.09rem;color:#63605f;transition:.3s;opacity:0;position:relative}hxa-selectize .hx-input-control .hx-label+.hx-help:after,hxa-selectize .hx-input-control .hx-label+.hx-help:before{content:'';position:absolute;top:-.4rem;width:0%;height:3px;background-color:#41b987;transition:.3s;z-index:1}hxa-selectize .hx-input-control .hx-label+.hx-help:before{left:50%}hxa-selectize .hx-input-control .hx-label+.hx-help:after{right:50%}hxa-selectize .hx-input-control.is-focused .hx-label{color:#41b987}hxa-selectize .hx-input-control.is-focused .hx-help{opacity:1}hxa-selectize .hx-input-control.is-focused .hx-help:after,hxa-selectize .hx-input-control.is-focused .hx-help:before{width:50%}hxa-selectize .hx-input-control.is-focused .hx-label,hxa-selectize .hx-input-control.is-valid .hx-label{top:-.5rem;font-size:.75rem}hxa-selectize .hx-input-control.is-focused .hx-label sup,hxa-selectize .hx-input-control.is-valid .hx-label sup{top:-.3rem;font-size:.4rem}hxa-selectize .selectize-control:focus{outline:0}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-label,hxa-selectize .selectize-control:valid~.hx-label{top:-.5rem;font-size:.75rem}hxa-selectize .selectize-control:-webkit-autofill~.hx-label sup,hxa-selectize .selectize-control:focus~.hx-label sup,hxa-selectize .selectize-control:valid~.hx-label sup{top:-.3rem;font-size:.4rem}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-label{color:#41b987}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-help{opacity:1}hxa-selectize .selectize-control:-webkit-autofill~.hx-label:after,hxa-selectize .selectize-control:-webkit-autofill~.hx-label:before,hxa-selectize .selectize-control:focus~.hx-help:after,hxa-selectize .selectize-control:focus~.hx-help:before{width:50%}hxa-selectize .selectize-control.is-disabled,hxa-selectize .selectize-control[disabled]{border-color:#aeadad;color:#aeadad;cursor:not-allowed}hxa-selectize .selectize-control.is-disabled~.hx-label,hxa-selectize .selectize-control[disabled]~.hx-label{top:-.5rem;font-size:.75rem;color:#aeadad;cursor:not-allowed}hxa-selectize .selectize-control.is-disabled~.hx-label sup,hxa-selectize .selectize-control[disabled]~.hx-label sup{font-size:.4rem}hxa-selectize.ng-invalid.ng-dirty .hx-label{color:#b81e4f}hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help{position:relative;opacity:1;color:#b81e4f}hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help:after,hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help:before{width:50%;background-color:#b81e4f}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:.7rem!important}.selectize-control.plugin-remove_button [data-value].is-medium{padding-right:1rem!important}.selectize-control.plugin-remove_button [data-value] .hx-delete{margin-left:-.2rem;height:16px;width:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px}.selectize-control.plugin-remove_button [data-value].is-medium .hx-delete{margin-left:-.5rem}.selectize-control.plugin-remove_button [data-value].is-large .hx-delete{margin-left:-.2rem;height:20px;width:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove{border-left-color:rgba(77,77,77,0)}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:28px;top:6px;font-size:23px}`]
},] },
];
/** @nocollapse */
SelectizeComponent.ctorParameters = () => [
{ type: IterableDiffers },
{ type: Renderer2 }
];
SelectizeComponent.propDecorators = {
config: [{ type: Input }],
id: [{ type: Input }],
placeholder: [{ type: Input }],
hasOptionsPlaceholder: [{ type: Input }],
noOptionsPlaceholder: [{ type: Input }],
enabled: [{ type: Input }],
value: [{ type: Input }],
formControl: [{ type: Input }],
errorClass: [{ type: Input }],
onBlur: [{ type: Output }],
onFocus: [{ type: Output }],
selectizeInput: [{ type: ViewChild, args: ['selectizeInput',] }],
options: [{ type: Input }],
optgroups: [{ type: Input }]
};
if (false) {
/** @type {?} */
SelectizeComponent.prototype._options;
/** @type {?} */
SelectizeComponent.prototype._options_differ;
/** @type {?} */
SelectizeComponent.prototype._optgroups;
/** @type {?} */
SelectizeComponent.prototype._optgroups_differ;
/** @type {?} */
SelectizeComponent.prototype.config;
/** @type {?} */
SelectizeComponent.prototype.id;
/** @type {?} */
SelectizeComponent.prototype.placeholder;
/** @type {?} */
SelectizeComponent.prototype.hasOptionsPlaceholder;
/** @type {?} */
SelectizeComponent.prototype.noOptionsPlaceholder;
/** @type {?} */
SelectizeComponent.prototype.enabled;
/** @type {?} */
SelectizeComponent.prototype.value;
/** @type {?} */
SelectizeComponent.prototype.formControl;
/** @type {?} */
SelectizeComponent.prototype.errorClass;
/** @type {?} */
SelectizeComponent.prototype.isFocused;
/** @type {?} */
SelectizeComponent.prototype.isValid;
/** @type {?} */
SelectizeComponent.prototype.onBlur;
/** @type {?} */
SelectizeComponent.prototype.onFocus;
/** @type {?} */
SelectizeComponent.prototype.selectizeInput;
/** @type {?} */
SelectizeComponent.prototype.selectize;
/** @type {?} */
SelectizeComponent.prototype.onTouchedCallback;
/** @type {?} */
SelectizeComponent.prototype.onChangeCallback;
/**
* Invoked anytime a key is pressed down on the selectize search field
* \@param e
* @type {?}
*/
SelectizeComponent.prototype.onKeydown;
/** @type {?} */
SelectizeComponent.prototype._differs;
/** @type {?} */
SelectizeComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aXplLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0aXplL3NlbGVjdGl6ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBS0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBSWYsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFdBQVcsRUFDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLckQsTUFBTSxPQUFPLHdCQUF3QixHQUFRO0lBQzNDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaO0FBYUQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7SUE4QjdCLFlBQW9CLFFBQXlCLEVBQVUsUUFBbUI7UUFBdEQsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbEJqRSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsVUFBSyxHQUFxQixFQUFFLENBQUM7UUFHdEMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRU4sV0FBTSxHQUF1QixJQUFJLFlBQVksQ0FBTyxLQUFLLENBQUMsQ0FBQztRQUMzRCxZQUFPLEdBQXVCLElBQUksWUFBWSxDQUFPLEtBQUssQ0FBQyxDQUFDOzs7OztRQXdQdEUsY0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7a0JBQ1QsTUFBTSxHQUFHLENBQUM7WUFDaEIsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixDQUFDLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFBO0lBdFA0RSxDQUFDOzs7O0lBRTlFLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFDakMsSUFBSSxFQUNKLElBQUksQ0FBQyxFQUFFLENBQ1IsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQzs7OztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FDN0QsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDOzs7Ozs7SUFLRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQ0UsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUM7Z0JBQy9DLE9BQU8sQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsRUFDOUM7Z0JBQ0EsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDMUI7WUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDOzs7Ozs7O0lBT0QsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTs7a0JBQ2xCLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3hELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNwQztTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7O2tCQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzVELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QztTQUNGO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxvQkFBb0IsQ0FBQyxPQUE2QjtRQUN4RCxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFpQyxFQUFFLEVBQUU7WUFDL0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQWlDLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRU8sd0JBQXdCLENBQUMsT0FBWTtRQUMzQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFpQyxFQUFFLEVBQUU7WUFDL0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQWlDLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFTyxjQUFjO1FBQ3BCLHlDQUF5QztRQUN6Qyx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyRCxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDOzs7OztJQUVELHNCQUFzQixDQUFDLFFBQWE7UUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0UsQ0FBQzs7Ozs7SUFFRCx5QkFBeUIsQ0FBQyxRQUFhO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs7Ozs7SUFLRCxvQkFBb0IsQ0FBQyxNQUFXO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Y0FDeEMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUN6QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7O2tCQUNSLEtBQUssR0FDVCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRO2dCQUM5RCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNoQixJQUNFLEtBQUs7Z0JBQ0wsS0FBSyxZQUFZLEtBQUs7Z0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ2pEO2dCQUNBLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNsRDtTQUNGO0lBQ0gsQ0FBQzs7Ozs7SUFFRCx1QkFBdUIsQ0FBQyxNQUFXO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQzs7OztJQUVELFlBQVk7O2NBQ0osTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNsRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDeEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxDQUFDO2FBQ2pEO2lCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxDQUFDO2FBQ3BEO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBR0QsV0FBVztJQUNYLENBQUM7Ozs7O0lBS0QsaUJBQWlCO1FBQ2YsSUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUM3RDtZQUNBLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQywrRUFBK0U7U0FDNUc7SUFDSCxDQUFDOzs7Ozs7SUFNRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRSxDQUFDOzs7O0lBR0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7O2tCQUNsQixNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOzs7Ozs7SUFNRCxzQkFBc0IsQ0FBQyxNQUFXO1FBQ2hDLDBEQUEwRDtRQUMxRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs7O2tCQUVuQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQztZQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7Ozs7OztJQU1ELGVBQWUsQ0FBQyxHQUFXO1FBQ3pCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs7OztJQUVELHVCQUF1QixDQUFDLE1BQVc7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQzs7Ozs7SUFtQkQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO2FBQ25DO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO2FBQ2xDO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7Ozs7OztJQU9ELFVBQVUsQ0FBQyxHQUFxQjtRQUM5QixJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBRWpCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUIsT0FBTztTQUNSOztjQUVLLFdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0I7WUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDOzs7Ozs7SUFNRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7Ozs7O0lBTUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7Ozs7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUM5QixDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ2pCLENBQUM7Ozs7O0lBRUQsSUFDSSxPQUFPLENBQUMsS0FBWTtRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUMzRDtJQUNILENBQUM7Ozs7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzs7Ozs7SUFFRCxJQUNJLFNBQVMsQ0FBQyxLQUFZO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksS0FBSyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM3RDtJQUNILENBQUM7Ozs7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQzs7O1lBM1hGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFOzs7O3FCQUlTO2dCQUNuQixTQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDckMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLE1BQU0sRUFBRSxDQUFDLHVvUUFBdW9RLENBQUM7YUFDbHBROzs7O1lBcENDLGVBQWU7WUFLZixTQUFTOzs7cUJBdUNSLEtBQUs7aUJBQ0wsS0FBSzswQkFDTCxLQUFLO29DQUNMLEtBQUs7bUNBQ0wsS0FBSztzQkFDTCxLQUFLO29CQUNMLEtBQUs7MEJBQ0wsS0FBSzt5QkFDTCxLQUFLO3FCQUlMLE1BQU07c0JBQ04sTUFBTTs2QkFFTixTQUFTLFNBQUMsZ0JBQWdCO3NCQW9VMUIsS0FBSzt3QkFZTCxLQUFLOzs7O0lBcFdOLHNDQUF3Qjs7SUFDeEIsNkNBQTZDOztJQUM3Qyx3Q0FBMEI7O0lBQzFCLCtDQUErQzs7SUFFL0Msb0NBQWlDOztJQUNqQyxnQ0FBb0I7O0lBQ3BCLHlDQUE2Qjs7SUFDN0IsbURBQXVDOztJQUN2QyxrREFBc0M7O0lBQ3RDLHFDQUF3Qjs7SUFDeEIsbUNBQXNDOztJQUN0Qyx5Q0FBa0M7O0lBQ2xDLHdDQUE0Qjs7SUFDNUIsdUNBQWtCOztJQUNsQixxQ0FBZ0I7O0lBRWhCLG9DQUFxRTs7SUFDckUscUNBQXNFOztJQUV0RSw0Q0FBaUQ7O0lBRWpELHVDQUF1Qjs7SUFHdkIsK0NBQW9DOztJQUNwQyw4Q0FBeUM7Ozs7OztJQWdQekMsdUNBUUM7O0lBdFBXLHNDQUFpQzs7SUFBRSxzQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBEb0NoZWNrLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEl0ZXJhYmxlRGlmZmVycyxcclxuICBJdGVyYWJsZURpZmZlcixcclxuICBJdGVyYWJsZUNoYW5nZVJlY29yZCxcclxuICBJdGVyYWJsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgUmVuZGVyZXIyLFxyXG4gIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIEZvcm1Db250cm9sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBTZWxlY3RpemVDb25maWcgfSBmcm9tICcuL3NlbGVjdGl6ZS5jb25maWcnO1xyXG5pbXBvcnQge0lTZWxlY3RpemVJdGVtfSBmcm9tICcuL3NlbGVjdGl6ZS1pdGVtLmludGVyZmFjZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5leHBvcnQgY29uc3QgU0VMRUNUSVpFX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0aXplQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtc2VsZWN0aXplJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJoeC1pbnB1dC1jb250cm9sXCIgW25nQ2xhc3NdPVwiY29uZmlnLmlucHV0Q29udHJvbENsYXNzZXNcIiBbY2xhc3MuaXMtZm9jdXNlZF09XCJpc0ZvY3VzZWRcIiBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0ICNzZWxlY3RpemVJbnB1dD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInt7aWR9fVwiIGNsYXNzPVwiaHgtbGFiZWxcIj57e2NvbmZpZy5sYWJlbH19IDxzdXAgKm5nSWY9XCJjb25maWcubWFuZGF0b3J5XCI+Kjwvc3VwPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1oZWxwXCI+e3tjb25maWcuaGVscH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YCxcclxuICBwcm92aWRlcnM6IFtTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3R5bGVzOiBbYC5zZWxlY3RpemUtY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZX0uc2VsZWN0aXplLWRyb3Bkb3duLC5zZWxlY3RpemUtaW5wdXQsLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjb2xvcjojMmEyYzJkO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOi45MnJlbTtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC1mb250LXNtb290aGluZzppbmhlcml0fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUsLnNlbGVjdGl6ZS1pbnB1dHtiYWNrZ3JvdW5kOjAgMDtjdXJzb3I6dGV4dDtkaXNwbGF5OmlubGluZS1ibG9ja30uc2VsZWN0aXplLWlucHV0e2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7Ym94LXNpemluZzpib3JkZXItYm94O2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXdpZHRoOjAgMCAxcHh9LnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuaGFzLWl0ZW1ze3BhZGRpbmc6NnB4IDAgM3B4fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aS5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtc3twYWRkaW5nLXJpZ2h0OjFyZW19LnNlbGVjdGl6ZS1pbnB1dC5mdWxse2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCwuc2VsZWN0aXplLWlucHV0LmRpc2FibGVkICp7Y3Vyc29yOmRlZmF1bHQhaW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQuZm9jdXN7Ym94LXNoYWRvdzpub25lfS5zZWxlY3RpemUtaW5wdXQuZHJvcGRvd24tYWN0aXZle2JvcmRlci1yYWRpdXM6MH0uc2VsZWN0aXplLWlucHV0Pip7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7em9vbToxfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0PmRpdntjdXJzb3I6cG9pbnRlcjttYXJnaW46NHB4O3BhZGRpbmc6MnB4IDZweDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjojMmEyYzJkO2JvcmRlcjowIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MjkwNDg2cHg7Zm9udC1zaXplOi43NXJlbTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpub3dyYXB9LnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQ+ZGl2LmFjdGl2ZXtiYWNrZ3JvdW5kOiNlOGU4ZTg7Y29sb3I6IzJhMmMyZDtib3JkZXI6MCBzb2xpZCAjY2FjYWNhfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0LmRpc2FibGVkPmRpdiwuc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZD5kaXYuYWN0aXZle2NvbG9yOiM3ODc4Nzg7YmFja2dyb3VuZDpyZ2JhKDc3LDc3LDc3LC4wNSk7Ym9yZGVyOjAgc29saWQgcmdiYSg3Nyw3Nyw3NywwKX0uc2VsZWN0aXplLWlucHV0PmlucHV0e2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luOjAgMnB4IDAgMCFpbXBvcnRhbnQ7dGV4dC1pbmRlbnQ6MCFpbXBvcnRhbnQ7Ym9yZGVyOjAhaW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtsaW5lLWhlaWdodDppbmhlcml0IWltcG9ydGFudDstd2Via2l0LXVzZXItc2VsZWN0OmF1dG8haW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQ+aW5wdXQ6Oi1tcy1jbGVhcntkaXNwbGF5Om5vbmV9LnNlbGVjdGl6ZS1pbnB1dD5pbnB1dDpmb2N1c3tvdXRsaW5lOjAhaW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQ6OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7Y2xlYXI6bGVmdH0uc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTo6YmVmb3Jle2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDojZjBmMGYwO2hlaWdodDoxcHg7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjB9Lmh4LXNlbGVjdC1jb250cm9sOmFmdGVye2Rpc3BsYXk6bm9uZX0uc2VsZWN0aXplLWRyb3Bkb3due3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTA7Ym9yZGVyOnRyYW5zcGFyZW50O2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MXB4IDAgMDtib3JkZXItdG9wOjA7Ym94LXNpemluZzpib3JkZXItYm94O2JveC1zaGFkb3c6MCA2cHggMTJweCByZ2JhKDAsMCwwLC4xNDUpO2JvcmRlci1yYWRpdXM6MH0uc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVde2N1cnNvcjpwb2ludGVyO292ZXJmbG93OmhpZGRlbn0uc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVdIC5oaWdobGlnaHR7YmFja2dyb3VuZDpyZ2JhKDM1LDQ5LDQzLC4yMyk7Ym9yZGVyLXJhZGl1czoxcHg7Zm9udC13ZWlnaHQ6NzAwfS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwLWhlYWRlciwuc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVde3BhZGRpbmc6NXB4IDhweH0uc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cDpmaXJzdC1jaGlsZCAub3B0Z3JvdXAtaGVhZGVye2JvcmRlci10b3A6MH0uc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cC1oZWFkZXJ7Y29sb3I6IzJhMmMyZDtiYWNrZ3JvdW5kOiNmZmY7Y3Vyc29yOmRlZmF1bHR9LnNlbGVjdGl6ZS1kcm9wZG93biAuYWN0aXZle2JhY2tncm91bmQtY29sb3I6IzQxYjk4Nztjb2xvcjojZmZmfS5zZWxlY3RpemUtZHJvcGRvd24gLmFjdGl2ZS5jcmVhdGV7Y29sb3I6I2ZmZn0uc2VsZWN0aXplLWRyb3Bkb3duIC5jcmVhdGV7Y29sb3I6cmdiYSg0Miw0NCw0NSwuNSl9LnNlbGVjdGl6ZS1kcm9wZG93bi1jb250ZW50e292ZXJmbG93LXk6YXV0bztvdmVyZmxvdy14OmhpZGRlbjttYXgtaGVpZ2h0OjIwMHB4Oy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LC5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0IGlucHV0LC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dCwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQgaW5wdXR7Y3Vyc29yOnBvaW50ZXJ9LnNlbGVjdGl6ZS1jb250cm9sLmhhc0NhcmV0IC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LmlucHV0LWFjdGl2ZSBpbnB1dCwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUgaW5wdXR7Y3Vyc29yOnRleHR9LnNlbGVjdGl6ZS1jb250cm9sLmhhc0NhcmV0IC5zZWxlY3RpemUtaW5wdXQ6YWZ0ZXIsLnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNXB4O21hcmdpbi10b3A6LTNweDt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci1jb2xvcjpncmV5IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTphZnRlciwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuZHJvcGRvd24tYWN0aXZlOmFmdGVye21hcmdpbi10b3A6LTRweDtib3JkZXItd2lkdGg6MCA1cHggNXB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBncmV5fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aS5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtczphZnRlcnt0b3A6aW5pdGlhbDtib3R0b206MS4zcmVtfS5zZWxlY3RpemUtY29udHJvbC5ydGwuaGFzQ2FyZXQgLnNlbGVjdGl6ZS1pbnB1dDphZnRlciwuc2VsZWN0aXplLWNvbnRyb2wucnRsLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2xlZnQ6MTVweDtyaWdodDphdXRvfS5zZWxlY3RpemUtY29udHJvbC5ydGwgLnNlbGVjdGl6ZS1pbnB1dD5pbnB1dHttYXJnaW46MCA0cHggMCAtMnB4IWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZHtvcGFjaXR5Oi41O2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9se3BhZGRpbmctdG9wOi4yMXJlbX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjdyZW07bWFyZ2luOjA7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiNhZWFkYWQ7bGVmdDowO3RyYW5zaXRpb246LjNzO3otaW5kZXg6MH1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCBzdXB7dG9wOi0uMnJlbTtjb2xvcjojYjgxZTRmO2ZvbnQtc2l6ZTouN3JlbTt0cmFuc2l0aW9uOi4zc31oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscHtmb250LXNpemU6Ljc1cmVtO21hcmdpbi10b3A6LS4wOXJlbTtjb2xvcjojNjM2MDVmO3RyYW5zaXRpb246LjNzO29wYWNpdHk6MDtwb3NpdGlvbjpyZWxhdGl2ZX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LS40cmVtO3dpZHRoOjAlO2hlaWdodDozcHg7YmFja2dyb3VuZC1jb2xvcjojNDFiOTg3O3RyYW5zaXRpb246LjNzO3otaW5kZXg6MX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDpiZWZvcmV7bGVmdDo1MCV9aHhhLXNlbGVjdGl6ZSAuaHgtaW5wdXQtY29udHJvbCAuaHgtbGFiZWwrLmh4LWhlbHA6YWZ0ZXJ7cmlnaHQ6NTAlfWh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtZm9jdXNlZCAuaHgtbGFiZWx7Y29sb3I6IzQxYjk4N31oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWhlbHB7b3BhY2l0eToxfWh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtZm9jdXNlZCAuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWhlbHA6YmVmb3Jle3dpZHRoOjUwJX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWxhYmVsLGh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtdmFsaWQgLmh4LWxhYmVse3RvcDotLjVyZW07Zm9udC1zaXplOi43NXJlbX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLXZhbGlkIC5oeC1sYWJlbCBzdXB7dG9wOi0uM3JlbTtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN7b3V0bGluZTowfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOmZvY3Vzfi5oeC1sYWJlbCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDp2YWxpZH4uaHgtbGFiZWx7dG9wOi0uNXJlbTtmb250LXNpemU6Ljc1cmVtfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtbGFiZWwgc3VwLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOnZhbGlkfi5oeC1sYWJlbCBzdXB7dG9wOi0uM3JlbTtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN+Lmh4LWxhYmVse2NvbG9yOiM0MWI5ODd9aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN+Lmh4LWhlbHB7b3BhY2l0eToxfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsOmFmdGVyLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsOmJlZm9yZSxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtaGVscDpiZWZvcmV7d2lkdGg6NTAlfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sLmlzLWRpc2FibGVkLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sW2Rpc2FibGVkXXtib3JkZXItY29sb3I6I2FlYWRhZDtjb2xvcjojYWVhZGFkO2N1cnNvcjpub3QtYWxsb3dlZH1oeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbC5pcy1kaXNhYmxlZH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2xbZGlzYWJsZWRdfi5oeC1sYWJlbHt0b3A6LS41cmVtO2ZvbnQtc2l6ZTouNzVyZW07Y29sb3I6I2FlYWRhZDtjdXJzb3I6bm90LWFsbG93ZWR9aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2wuaXMtZGlzYWJsZWR+Lmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbFtkaXNhYmxlZF1+Lmh4LWxhYmVsIHN1cHtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZS5uZy1pbnZhbGlkLm5nLWRpcnR5IC5oeC1sYWJlbHtjb2xvcjojYjgxZTRmfWh4YS1zZWxlY3RpemUubmctaW52YWxpZC5uZy1kaXJ0eSAuaHgtbGFiZWwrLmh4LWhlbHB7cG9zaXRpb246cmVsYXRpdmU7b3BhY2l0eToxO2NvbG9yOiNiODFlNGZ9aHhhLXNlbGVjdGl6ZS5uZy1pbnZhbGlkLm5nLWRpcnR5IC5oeC1sYWJlbCsuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplLm5nLWludmFsaWQubmctZGlydHkgLmh4LWxhYmVsKy5oeC1oZWxwOmJlZm9yZXt3aWR0aDo1MCU7YmFja2dyb3VuZC1jb2xvcjojYjgxZTRmfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV17cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1yaWdodDouN3JlbSFpbXBvcnRhbnR9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXS5pcy1tZWRpdW17cGFkZGluZy1yaWdodDoxcmVtIWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS4ycmVtO2hlaWdodDoxNnB4O3dpZHRoOjE2cHg7bWF4LWhlaWdodDoxNnB4O21heC13aWR0aDoxNnB4O21pbi1oZWlnaHQ6MTZweDttaW4td2lkdGg6MTZweH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLW1lZGl1bSAuaHgtZGVsZXRle21hcmdpbi1sZWZ0Oi0uNXJlbX0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLWxhcmdlIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS4ycmVtO2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7bWF4LWhlaWdodDoyMHB4O21heC13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDttaW4td2lkdGg6MjBweH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLmRpc2FibGVkIFtkYXRhLXZhbHVlXSAuaHgtcmVtb3ZlOmhvdmVye2JhY2tncm91bmQ6MCAwfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAuZGlzYWJsZWQgW2RhdGEtdmFsdWVdIC5oeC1yZW1vdmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSg3Nyw3Nyw3NywwKX0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLnJlbW92ZS1zaW5nbGV7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MjhweDt0b3A6NnB4O2ZvbnQtc2l6ZToyM3B4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RpemVDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9vcHRpb25zOiBhbnlbXTtcclxuICBwcml2YXRlIF9vcHRpb25zX2RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuICBwcml2YXRlIF9vcHRncm91cHM6IGFueVtdO1xyXG4gIHByaXZhdGUgX29wdGdyb3Vwc19kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT47XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZzogU2VsZWN0aXplQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBoYXNPcHRpb25zUGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBub09wdGlvbnNQbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGVuYWJsZWQgPSB0cnVlO1xyXG4gIE