@angular/core
Version:
Angular - the core framework
1,241 lines • 105 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: packages/core/src/render3/instructions/lview_debug.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { assertDefined } from '../../util/assert';
import { createNamedArrayType } from '../../util/named_array_type';
import { initNgDevMode } from '../../util/ng_dev_mode';
import { CONTAINER_HEADER_OFFSET, HAS_TRANSPLANTED_VIEWS, MOVED_VIEWS, NATIVE } from '../interfaces/container';
import { COMMENT_MARKER, ELEMENT_MARKER } from '../interfaces/i18n';
import { getTStylingRangeNext, getTStylingRangeNextDuplicate, getTStylingRangePrev, getTStylingRangePrevDuplicate } from '../interfaces/styling';
import { CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, FLAGS, HEADER_OFFSET, HOST, INJECTOR, NEXT, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, SANITIZER, T_HOST, TVIEW } from '../interfaces/view';
import { attachDebugObject } from '../util/debug_utils';
import { getTNode, unwrapRNode } from '../util/view_utils';
/** @type {?} */
const NG_DEV_MODE = ((typeof ngDevMode === 'undefined' || !!ngDevMode) && initNgDevMode());
/*
* This file contains conditionally attached classes which provide human readable (debug) level
* information for `LView`, `LContainer` and other internal data structures. These data structures
* are stored internally as array which makes it very difficult during debugging to reason about the
* current state of the system.
*
* Patching the array with extra property does change the array's hidden class' but it does not
* change the cost of access, therefore this patching should not have significant if any impact in
* `ngDevMode` mode. (see: https://jsperf.com/array-vs-monkey-patch-array)
*
* So instead of seeing:
* ```
* Array(30) [Object, 659, null, …]
* ```
*
* You get to see:
* ```
* LViewDebug {
* views: [...],
* flags: {attached: true, ...}
* nodes: [
* {html: '<div id="123">', ..., nodes: [
* {html: '<span>', ..., nodes: null}
* ]}
* ]
* }
* ```
*/
/** @type {?} */
let LVIEW_COMPONENT_CACHE;
/** @type {?} */
let LVIEW_EMBEDDED_CACHE;
/** @type {?} */
let LVIEW_ROOT;
/**
* @record
*/
function TViewDebug() { }
if (false) {
/** @type {?} */
TViewDebug.prototype.type;
}
/**
* This function clones a blueprint and creates LView.
*
* Simple slice will keep the same type, and we need it to be LView
* @param {?} tView
* @return {?}
*/
export function cloneToLViewFromTViewBlueprint(tView) {
/** @type {?} */
const debugTView = (/** @type {?} */ (tView));
/** @type {?} */
const lView = getLViewToClone(debugTView.type, tView.template && tView.template.name);
return (/** @type {?} */ (lView.concat(tView.blueprint)));
}
/**
* @param {?} type
* @param {?} name
* @return {?}
*/
function getLViewToClone(type, name) {
switch (type) {
case 0 /* Root */:
if (LVIEW_ROOT === undefined)
LVIEW_ROOT = new (createNamedArrayType('LRootView'))();
return LVIEW_ROOT;
case 1 /* Component */:
if (LVIEW_COMPONENT_CACHE === undefined)
LVIEW_COMPONENT_CACHE = new Map();
/** @type {?} */
let componentArray = LVIEW_COMPONENT_CACHE.get(name);
if (componentArray === undefined) {
componentArray = new (createNamedArrayType('LComponentView' + nameSuffix(name)))();
LVIEW_COMPONENT_CACHE.set(name, componentArray);
}
return componentArray;
case 2 /* Embedded */:
if (LVIEW_EMBEDDED_CACHE === undefined)
LVIEW_EMBEDDED_CACHE = new Map();
/** @type {?} */
let embeddedArray = LVIEW_EMBEDDED_CACHE.get(name);
if (embeddedArray === undefined) {
embeddedArray = new (createNamedArrayType('LEmbeddedView' + nameSuffix(name)))();
LVIEW_EMBEDDED_CACHE.set(name, embeddedArray);
}
return embeddedArray;
}
throw new Error('unreachable code');
}
/**
* @param {?} text
* @return {?}
*/
function nameSuffix(text) {
if (text == null)
return '';
/** @type {?} */
const index = text.lastIndexOf('_Template');
return '_' + (index === -1 ? text : text.substr(0, index));
}
/**
* This class is a debug version of Object literal so that we can have constructor name show up
* in
* debug tools in ngDevMode.
* @type {?}
*/
export const TViewConstructor = class TView {
/**
* @param {?} type
* @param {?} id
* @param {?} blueprint
* @param {?} template
* @param {?} queries
* @param {?} viewQuery
* @param {?} node
* @param {?} data
* @param {?} bindingStartIndex
* @param {?} expandoStartIndex
* @param {?} expandoInstructions
* @param {?} firstCreatePass
* @param {?} firstUpdatePass
* @param {?} staticViewQueries
* @param {?} staticContentQueries
* @param {?} preOrderHooks
* @param {?} preOrderCheckHooks
* @param {?} contentHooks
* @param {?} contentCheckHooks
* @param {?} viewHooks
* @param {?} viewCheckHooks
* @param {?} destroyHooks
* @param {?} cleanup
* @param {?} contentQueries
* @param {?} components
* @param {?} directiveRegistry
* @param {?} pipeRegistry
* @param {?} firstChild
* @param {?} schemas
* @param {?} consts
* @param {?} incompleteFirstPass
*/
constructor(type, //
id, //
blueprint, //
template, //
queries, //
viewQuery, //
node, //
data, //
bindingStartIndex, //
expandoStartIndex, //
expandoInstructions, //
firstCreatePass, //
firstUpdatePass, //
staticViewQueries, //
staticContentQueries, //
preOrderHooks, //
preOrderCheckHooks, //
contentHooks, //
contentCheckHooks, //
viewHooks, //
viewCheckHooks, //
destroyHooks, //
cleanup, //
contentQueries, //
components, //
directiveRegistry, //
pipeRegistry, //
firstChild, //
schemas, //
consts, //
incompleteFirstPass //
) {
this.type = type;
this.id = id;
this.blueprint = blueprint;
this.template = template;
this.queries = queries;
this.viewQuery = viewQuery;
this.node = node;
this.data = data;
this.bindingStartIndex = bindingStartIndex;
this.expandoStartIndex = expandoStartIndex;
this.expandoInstructions = expandoInstructions;
this.firstCreatePass = firstCreatePass;
this.firstUpdatePass = firstUpdatePass;
this.staticViewQueries = staticViewQueries;
this.staticContentQueries = staticContentQueries;
this.preOrderHooks = preOrderHooks;
this.preOrderCheckHooks = preOrderCheckHooks;
this.contentHooks = contentHooks;
this.contentCheckHooks = contentCheckHooks;
this.viewHooks = viewHooks;
this.viewCheckHooks = viewCheckHooks;
this.destroyHooks = destroyHooks;
this.cleanup = cleanup;
this.contentQueries = contentQueries;
this.components = components;
this.directiveRegistry = directiveRegistry;
this.pipeRegistry = pipeRegistry;
this.firstChild = firstChild;
this.schemas = schemas;
this.consts = consts;
this.incompleteFirstPass = incompleteFirstPass;
}
/**
* @return {?}
*/
get template_() {
/** @type {?} */
const buf = [];
processTNodeChildren(this.firstChild, buf);
return buf.join('');
}
};
class TNode {
/**
* @param {?} tView_
* @param {?} type
* @param {?} index
* @param {?} injectorIndex
* @param {?} directiveStart
* @param {?} directiveEnd
* @param {?} directiveStylingLast
* @param {?} propertyBindings
* @param {?} flags
* @param {?} providerIndexes
* @param {?} tagName
* @param {?} attrs
* @param {?} mergedAttrs
* @param {?} localNames
* @param {?} initialInputs
* @param {?} inputs
* @param {?} outputs
* @param {?} tViews
* @param {?} next
* @param {?} projectionNext
* @param {?} child
* @param {?} parent
* @param {?} projection
* @param {?} styles
* @param {?} stylesWithoutHost
* @param {?} residualStyles
* @param {?} classes
* @param {?} classesWithoutHost
* @param {?} residualClasses
* @param {?} classBindings
* @param {?} styleBindings
*/
constructor(tView_, //
type, //
index, //
injectorIndex, //
directiveStart, //
directiveEnd, //
directiveStylingLast, //
propertyBindings, //
flags, //
providerIndexes, //
tagName, //
attrs, //
mergedAttrs, //
localNames, //
initialInputs, //
inputs, //
outputs, //
tViews, //
next, //
projectionNext, //
child, //
parent, //
projection, //
styles, //
stylesWithoutHost, //
residualStyles, //
classes, //
classesWithoutHost, //
residualClasses, //
classBindings, //
styleBindings) {
this.tView_ = tView_;
this.type = type;
this.index = index;
this.injectorIndex = injectorIndex;
this.directiveStart = directiveStart;
this.directiveEnd = directiveEnd;
this.directiveStylingLast = directiveStylingLast;
this.propertyBindings = propertyBindings;
this.flags = flags;
this.providerIndexes = providerIndexes;
this.tagName = tagName;
this.attrs = attrs;
this.mergedAttrs = mergedAttrs;
this.localNames = localNames;
this.initialInputs = initialInputs;
this.inputs = inputs;
this.outputs = outputs;
this.tViews = tViews;
this.next = next;
this.projectionNext = projectionNext;
this.child = child;
this.parent = parent;
this.projection = projection;
this.styles = styles;
this.stylesWithoutHost = stylesWithoutHost;
this.residualStyles = residualStyles;
this.classes = classes;
this.classesWithoutHost = classesWithoutHost;
this.residualClasses = residualClasses;
this.classBindings = classBindings;
this.styleBindings = styleBindings;
}
/**
* @return {?}
*/
get type_() {
switch (this.type) {
case 0 /* Container */:
return 'TNodeType.Container';
case 3 /* Element */:
return 'TNodeType.Element';
case 4 /* ElementContainer */:
return 'TNodeType.ElementContainer';
case 5 /* IcuContainer */:
return 'TNodeType.IcuContainer';
case 1 /* Projection */:
return 'TNodeType.Projection';
case 2 /* View */:
return 'TNodeType.View';
default:
return 'TNodeType.???';
}
}
/**
* @return {?}
*/
get flags_() {
/** @type {?} */
const flags = [];
if (this.flags & 16 /* hasClassInput */)
flags.push('TNodeFlags.hasClassInput');
if (this.flags & 8 /* hasContentQuery */)
flags.push('TNodeFlags.hasContentQuery');
if (this.flags & 32 /* hasStyleInput */)
flags.push('TNodeFlags.hasStyleInput');
if (this.flags & 128 /* hasHostBindings */)
flags.push('TNodeFlags.hasHostBindings');
if (this.flags & 2 /* isComponentHost */)
flags.push('TNodeFlags.isComponentHost');
if (this.flags & 1 /* isDirectiveHost */)
flags.push('TNodeFlags.isDirectiveHost');
if (this.flags & 64 /* isDetached */)
flags.push('TNodeFlags.isDetached');
if (this.flags & 4 /* isProjected */)
flags.push('TNodeFlags.isProjected');
return flags.join('|');
}
/**
* @return {?}
*/
get template_() {
/** @type {?} */
const buf = [];
buf.push('<', this.tagName || this.type_);
if (this.attrs) {
for (let i = 0; i < this.attrs.length;) {
/** @type {?} */
const attrName = this.attrs[i++];
if (typeof attrName == 'number') {
break;
}
/** @type {?} */
const attrValue = this.attrs[i++];
buf.push(' ', (/** @type {?} */ (attrName)), '="', (/** @type {?} */ (attrValue)), '"');
}
}
buf.push('>');
processTNodeChildren(this.child, buf);
buf.push('</', this.tagName || this.type_, '>');
return buf.join('');
}
/**
* @return {?}
*/
get styleBindings_() {
return toDebugStyleBinding(this, false);
}
/**
* @return {?}
*/
get classBindings_() {
return toDebugStyleBinding(this, true);
}
}
if (false) {
/** @type {?} */
TNode.prototype.tView_;
/** @type {?} */
TNode.prototype.type;
/** @type {?} */
TNode.prototype.index;
/** @type {?} */
TNode.prototype.injectorIndex;
/** @type {?} */
TNode.prototype.directiveStart;
/** @type {?} */
TNode.prototype.directiveEnd;
/** @type {?} */
TNode.prototype.directiveStylingLast;
/** @type {?} */
TNode.prototype.propertyBindings;
/** @type {?} */
TNode.prototype.flags;
/** @type {?} */
TNode.prototype.providerIndexes;
/** @type {?} */
TNode.prototype.tagName;
/** @type {?} */
TNode.prototype.attrs;
/** @type {?} */
TNode.prototype.mergedAttrs;
/** @type {?} */
TNode.prototype.localNames;
/** @type {?} */
TNode.prototype.initialInputs;
/** @type {?} */
TNode.prototype.inputs;
/** @type {?} */
TNode.prototype.outputs;
/** @type {?} */
TNode.prototype.tViews;
/** @type {?} */
TNode.prototype.next;
/** @type {?} */
TNode.prototype.projectionNext;
/** @type {?} */
TNode.prototype.child;
/** @type {?} */
TNode.prototype.parent;
/** @type {?} */
TNode.prototype.projection;
/** @type {?} */
TNode.prototype.styles;
/** @type {?} */
TNode.prototype.stylesWithoutHost;
/** @type {?} */
TNode.prototype.residualStyles;
/** @type {?} */
TNode.prototype.classes;
/** @type {?} */
TNode.prototype.classesWithoutHost;
/** @type {?} */
TNode.prototype.residualClasses;
/** @type {?} */
TNode.prototype.classBindings;
/** @type {?} */
TNode.prototype.styleBindings;
}
/** @type {?} */
export const TNodeDebug = TNode;
/**
* @record
*/
export function DebugStyleBindings() { }
/**
* @record
*/
export function DebugStyleBinding() { }
if (false) {
/** @type {?} */
DebugStyleBinding.prototype.key;
/** @type {?} */
DebugStyleBinding.prototype.index;
/** @type {?} */
DebugStyleBinding.prototype.isTemplate;
/** @type {?} */
DebugStyleBinding.prototype.prevDuplicate;
/** @type {?} */
DebugStyleBinding.prototype.nextDuplicate;
/** @type {?} */
DebugStyleBinding.prototype.prevIndex;
/** @type {?} */
DebugStyleBinding.prototype.nextIndex;
}
/**
* @param {?} tNode
* @param {?} isClassBased
* @return {?}
*/
function toDebugStyleBinding(tNode, isClassBased) {
/** @type {?} */
const tData = tNode.tView_.data;
/** @type {?} */
const bindings = (/** @type {?} */ ([]));
/** @type {?} */
const range = isClassBased ? tNode.classBindings : tNode.styleBindings;
/** @type {?} */
const prev = getTStylingRangePrev(range);
/** @type {?} */
const next = getTStylingRangeNext(range);
/** @type {?} */
let isTemplate = next !== 0;
/** @type {?} */
let cursor = isTemplate ? next : prev;
while (cursor !== 0) {
/** @type {?} */
const itemKey = (/** @type {?} */ (tData[cursor]));
/** @type {?} */
const itemRange = (/** @type {?} */ (tData[cursor + 1]));
bindings.unshift({
key: itemKey,
index: cursor,
isTemplate: isTemplate,
prevDuplicate: getTStylingRangePrevDuplicate(itemRange),
nextDuplicate: getTStylingRangeNextDuplicate(itemRange),
nextIndex: getTStylingRangeNext(itemRange),
prevIndex: getTStylingRangePrev(itemRange),
});
if (cursor === prev)
isTemplate = false;
cursor = getTStylingRangePrev(itemRange);
}
bindings.push((isClassBased ? tNode.residualClasses : tNode.residualStyles) || null);
return bindings;
}
/**
* @param {?} tNode
* @param {?} buf
* @return {?}
*/
function processTNodeChildren(tNode, buf) {
while (tNode) {
buf.push(((/** @type {?} */ ((/** @type {?} */ (tNode))))).template_);
tNode = tNode.next;
}
}
/** @type {?} */
const TViewData = NG_DEV_MODE && createNamedArrayType('TViewData') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
let TVIEWDATA_EMPTY;
// can't initialize here or it will not be tree shaken, because
// `LView` constructor could have side-effects.
/**
* This function clones a blueprint and creates TData.
*
* Simple slice will keep the same type, and we need it to be TData
* @param {?} list
* @return {?}
*/
export function cloneToTViewData(list) {
if (TVIEWDATA_EMPTY === undefined)
TVIEWDATA_EMPTY = new TViewData();
return (/** @type {?} */ (TVIEWDATA_EMPTY.concat(list)));
}
/** @type {?} */
export const LViewBlueprint = NG_DEV_MODE && createNamedArrayType('LViewBlueprint') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const MatchesArray = NG_DEV_MODE && createNamedArrayType('MatchesArray') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const TViewComponents = NG_DEV_MODE && createNamedArrayType('TViewComponents') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const TNodeLocalNames = NG_DEV_MODE && createNamedArrayType('TNodeLocalNames') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const TNodeInitialInputs = NG_DEV_MODE && createNamedArrayType('TNodeInitialInputs') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const TNodeInitialData = NG_DEV_MODE && createNamedArrayType('TNodeInitialData') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const LCleanup = NG_DEV_MODE && createNamedArrayType('LCleanup') || (/** @type {?} */ ((/** @type {?} */ (null))));
/** @type {?} */
export const TCleanup = NG_DEV_MODE && createNamedArrayType('TCleanup') || (/** @type {?} */ ((/** @type {?} */ (null))));
/**
* @param {?} lView
* @return {?}
*/
export function attachLViewDebug(lView) {
attachDebugObject(lView, new LViewDebug(lView));
}
/**
* @param {?} lContainer
* @return {?}
*/
export function attachLContainerDebug(lContainer) {
attachDebugObject(lContainer, new LContainerDebug(lContainer));
}
/**
* @param {?} obj
* @return {?}
*/
export function toDebug(obj) {
if (obj) {
/** @type {?} */
const debug = ((/** @type {?} */ (obj))).debug;
assertDefined(debug, 'Object does not have a debug representation.');
return debug;
}
else {
return obj;
}
}
/**
* Use this method to unwrap a native element in `LView` and convert it into HTML for easier
* reading.
*
* @param {?} value possibly wrapped native DOM node.
* @param {?=} includeChildren If `true` then the serialized HTML form will include child elements
* (same
* as `outerHTML`). If `false` then the serialized HTML form will only contain the element
* itself
* (will not serialize child elements).
* @return {?}
*/
function toHtml(value, includeChildren = false) {
/** @type {?} */
const node = (/** @type {?} */ (unwrapRNode(value)));
if (node) {
/** @type {?} */
const isTextNode = node.nodeType === Node.TEXT_NODE;
/** @type {?} */
const outerHTML = (isTextNode ? node.textContent : node.outerHTML) || '';
if (includeChildren || isTextNode) {
return outerHTML;
}
else {
/** @type {?} */
const innerHTML = '>' + node.innerHTML + '<';
return (outerHTML.split(innerHTML)[0]) + '>';
}
}
else {
return null;
}
}
export class LViewDebug {
/**
* @param {?} _raw_lView
*/
constructor(_raw_lView) {
this._raw_lView = _raw_lView;
}
/**
* Flags associated with the `LView` unpacked into a more readable state.
* @return {?}
*/
get flags() {
/** @type {?} */
const flags = this._raw_lView[FLAGS];
return {
__raw__flags__: flags,
initPhaseState: flags & 3 /* InitPhaseStateMask */,
creationMode: !!(flags & 4 /* CreationMode */),
firstViewPass: !!(flags & 8 /* FirstLViewPass */),
checkAlways: !!(flags & 16 /* CheckAlways */),
dirty: !!(flags & 64 /* Dirty */),
attached: !!(flags & 128 /* Attached */),
destroyed: !!(flags & 256 /* Destroyed */),
isRoot: !!(flags & 512 /* IsRoot */),
indexWithinInitPhase: flags >> 11 /* IndexWithinInitPhaseShift */,
};
}
/**
* @return {?}
*/
get parent() {
return toDebug(this._raw_lView[PARENT]);
}
/**
* @return {?}
*/
get host() {
return toHtml(this._raw_lView[HOST], true);
}
/**
* @return {?}
*/
get html() {
return (this.nodes || []).map((/**
* @param {?} node
* @return {?}
*/
node => toHtml(node.native, true))).join('');
}
/**
* @return {?}
*/
get context() {
return this._raw_lView[CONTEXT];
}
/**
* The tree of nodes associated with the current `LView`. The nodes have been normalized into
* a
* tree structure with relevant details pulled out for readability.
* @return {?}
*/
get nodes() {
/** @type {?} */
const lView = this._raw_lView;
/** @type {?} */
const tNode = lView[TVIEW].firstChild;
return toDebugNodes(tNode, lView);
}
/**
* @return {?}
*/
get tView() {
return this._raw_lView[TVIEW];
}
/**
* @return {?}
*/
get cleanup() {
return this._raw_lView[CLEANUP];
}
/**
* @return {?}
*/
get injector() {
return this._raw_lView[INJECTOR];
}
/**
* @return {?}
*/
get rendererFactory() {
return this._raw_lView[RENDERER_FACTORY];
}
/**
* @return {?}
*/
get renderer() {
return this._raw_lView[RENDERER];
}
/**
* @return {?}
*/
get sanitizer() {
return this._raw_lView[SANITIZER];
}
/**
* @return {?}
*/
get childHead() {
return toDebug(this._raw_lView[CHILD_HEAD]);
}
/**
* @return {?}
*/
get next() {
return toDebug(this._raw_lView[NEXT]);
}
/**
* @return {?}
*/
get childTail() {
return toDebug(this._raw_lView[CHILD_TAIL]);
}
/**
* @return {?}
*/
get declarationView() {
return toDebug(this._raw_lView[DECLARATION_VIEW]);
}
/**
* @return {?}
*/
get queries() {
return this._raw_lView[QUERIES];
}
/**
* @return {?}
*/
get tHost() {
return this._raw_lView[T_HOST];
}
/**
* Normalized view of child views (and containers) attached at this location.
* @return {?}
*/
get childViews() {
/** @type {?} */
const childViews = [];
/** @type {?} */
let child = this.childHead;
while (child) {
childViews.push(child);
child = child.next;
}
return childViews;
}
}
if (false) {
/**
* @type {?}
* @private
*/
LViewDebug.prototype._raw_lView;
}
/**
* @record
*/
export function DebugNode() { }
if (false) {
/** @type {?} */
DebugNode.prototype.html;
/** @type {?} */
DebugNode.prototype.native;
/** @type {?} */
DebugNode.prototype.nodes;
/** @type {?} */
DebugNode.prototype.component;
}
/**
* Turns a flat list of nodes into a tree by walking the associated `TNode` tree.
*
* @param {?} tNode
* @param {?} lView
* @return {?}
*/
export function toDebugNodes(tNode, lView) {
if (tNode) {
/** @type {?} */
const debugNodes = [];
/** @type {?} */
let tNodeCursor = tNode;
while (tNodeCursor) {
debugNodes.push(buildDebugNode(tNodeCursor, lView, tNodeCursor.index));
tNodeCursor = tNodeCursor.next;
}
return debugNodes;
}
else {
return null;
}
}
/**
* @param {?} tNode
* @param {?} lView
* @param {?} nodeIndex
* @return {?}
*/
export function buildDebugNode(tNode, lView, nodeIndex) {
/** @type {?} */
const rawValue = lView[nodeIndex];
/** @type {?} */
const native = unwrapRNode(rawValue);
/** @type {?} */
const componentLViewDebug = toDebug(readLViewValue(rawValue));
return {
html: toHtml(native),
native: (/** @type {?} */ (native)),
nodes: toDebugNodes(tNode.child, lView),
component: componentLViewDebug,
};
}
export class LContainerDebug {
/**
* @param {?} _raw_lContainer
*/
constructor(_raw_lContainer) {
this._raw_lContainer = _raw_lContainer;
}
/**
* @return {?}
*/
get hasTransplantedViews() {
return this._raw_lContainer[HAS_TRANSPLANTED_VIEWS];
}
/**
* @return {?}
*/
get views() {
return this._raw_lContainer.slice(CONTAINER_HEADER_OFFSET)
.map((/** @type {?} */ (toDebug)));
}
/**
* @return {?}
*/
get parent() {
return toDebug(this._raw_lContainer[PARENT]);
}
/**
* @return {?}
*/
get movedViews() {
return this._raw_lContainer[MOVED_VIEWS];
}
/**
* @return {?}
*/
get host() {
return this._raw_lContainer[HOST];
}
/**
* @return {?}
*/
get native() {
return this._raw_lContainer[NATIVE];
}
/**
* @return {?}
*/
get next() {
return toDebug(this._raw_lContainer[NEXT]);
}
}
if (false) {
/**
* @type {?}
* @private
*/
LContainerDebug.prototype._raw_lContainer;
}
/**
* Return an `LView` value if found.
*
* @param {?} value `LView` if any
* @return {?}
*/
export function readLViewValue(value) {
while (Array.isArray(value)) {
// This check is not quite right, as it does not take into account `StylingContext`
// This is why it is in debug, not in util.ts
if (value.length >= HEADER_OFFSET - 1)
return (/** @type {?} */ (value));
value = value[HOST];
}
return null;
}
export class I18NDebugItem {
/**
* @param {?} __raw_opCode
* @param {?} _lView
* @param {?} nodeIndex
* @param {?} type
*/
constructor(__raw_opCode, _lView, nodeIndex, type) {
this.__raw_opCode = __raw_opCode;
this._lView = _lView;
this.nodeIndex = nodeIndex;
this.type = type;
}
/**
* @return {?}
*/
get tNode() {
return getTNode(this._lView[TVIEW], this.nodeIndex);
}
}
if (false) {
/** @type {?} */
I18NDebugItem.prototype.__raw_opCode;
/**
* @type {?}
* @private
*/
I18NDebugItem.prototype._lView;
/** @type {?} */
I18NDebugItem.prototype.nodeIndex;
/** @type {?} */
I18NDebugItem.prototype.type;
/* Skipping unhandled member: [key: string]: any;*/
}
/**
* Turns a list of "Create" & "Update" OpCodes into a human-readable list of operations for
* debugging purposes.
* @param {?} mutateOpCodes mutation opCodes to read
* @param {?} updateOpCodes update opCodes to read
* @param {?} icus list of ICU expressions
* @param {?} lView The view the opCodes are acting on
* @return {?}
*/
export function attachI18nOpCodesDebug(mutateOpCodes, updateOpCodes, icus, lView) {
attachDebugObject(mutateOpCodes, new I18nMutateOpCodesDebug(mutateOpCodes, lView));
attachDebugObject(updateOpCodes, new I18nUpdateOpCodesDebug(updateOpCodes, icus, lView));
if (icus) {
icus.forEach((/**
* @param {?} icu
* @return {?}
*/
icu => {
icu.create.forEach((/**
* @param {?} icuCase
* @return {?}
*/
icuCase => {
attachDebugObject(icuCase, new I18nMutateOpCodesDebug(icuCase, lView));
}));
icu.update.forEach((/**
* @param {?} icuCase
* @return {?}
*/
icuCase => {
attachDebugObject(icuCase, new I18nUpdateOpCodesDebug(icuCase, icus, lView));
}));
}));
}
}
export class I18nMutateOpCodesDebug {
/**
* @param {?} __raw_opCodes
* @param {?} __lView
*/
constructor(__raw_opCodes, __lView) {
this.__raw_opCodes = __raw_opCodes;
this.__lView = __lView;
}
/**
* A list of operation information about how the OpCodes will act on the view.
* @return {?}
*/
get operations() {
const { __lView, __raw_opCodes } = this;
/** @type {?} */
const results = [];
for (let i = 0; i < __raw_opCodes.length; i++) {
/** @type {?} */
const opCode = __raw_opCodes[i];
/** @type {?} */
let result;
if (typeof opCode === 'string') {
result = {
__raw_opCode: opCode,
type: 'Create Text Node',
nodeIndex: __raw_opCodes[++i],
text: opCode,
};
}
if (typeof opCode === 'number') {
switch (opCode & 7 /* MASK_OPCODE */) {
case 1 /* AppendChild */:
/** @type {?} */
const destinationNodeIndex = opCode >>> 17 /* SHIFT_PARENT */;
result = new I18NDebugItem(opCode, __lView, destinationNodeIndex, 'AppendChild');
break;
case 0 /* Select */:
/** @type {?} */
const nodeIndex = opCode >>> 3 /* SHIFT_REF */;
result = new I18NDebugItem(opCode, __lView, nodeIndex, 'Select');
break;
case 5 /* ElementEnd */:
/** @type {?} */
let elementIndex = opCode >>> 3 /* SHIFT_REF */;
result = new I18NDebugItem(opCode, __lView, elementIndex, 'ElementEnd');
break;
case 4 /* Attr */:
elementIndex = opCode >>> 3 /* SHIFT_REF */;
result = new I18NDebugItem(opCode, __lView, elementIndex, 'Attr');
result['attrName'] = __raw_opCodes[++i];
result['attrValue'] = __raw_opCodes[++i];
break;
}
}
if (!result) {
switch (opCode) {
case COMMENT_MARKER:
result = {
__raw_opCode: opCode,
type: 'COMMENT_MARKER',
commentValue: __raw_opCodes[++i],
nodeIndex: __raw_opCodes[++i],
};
break;
case ELEMENT_MARKER:
result = {
__raw_opCode: opCode,
type: 'ELEMENT_MARKER',
};
break;
}
}
if (!result) {
result = {
__raw_opCode: opCode,
type: 'Unknown Op Code',
code: opCode,
};
}
results.push(result);
}
return results;
}
}
if (false) {
/**
* @type {?}
* @private
*/
I18nMutateOpCodesDebug.prototype.__raw_opCodes;
/**
* @type {?}
* @private
*/
I18nMutateOpCodesDebug.prototype.__lView;
}
export class I18nUpdateOpCodesDebug {
/**
* @param {?} __raw_opCodes
* @param {?} icus
* @param {?} __lView
*/
constructor(__raw_opCodes, icus, __lView) {
this.__raw_opCodes = __raw_opCodes;
this.icus = icus;
this.__lView = __lView;
}
/**
* A list of operation information about how the OpCodes will act on the view.
* @return {?}
*/
get operations() {
const { __lView, __raw_opCodes, icus } = this;
/** @type {?} */
const results = [];
for (let i = 0; i < __raw_opCodes.length; i++) {
// bit code to check if we should apply the next update
/** @type {?} */
const checkBit = (/** @type {?} */ (__raw_opCodes[i]));
// Number of opCodes to skip until next set of update codes
/** @type {?} */
const skipCodes = (/** @type {?} */ (__raw_opCodes[++i]));
/** @type {?} */
let value = '';
for (let j = i + 1; j <= (i + skipCodes); j++) {
/** @type {?} */
const opCode = __raw_opCodes[j];
if (typeof opCode === 'string') {
value += opCode;
}
else if (typeof opCode == 'number') {
if (opCode < 0) {
// It's a binding index whose value is negative
// We cannot know the value of the binding so we only show the index
value += `�${-opCode - 1}�`;
}
else {
/** @type {?} */
const nodeIndex = opCode >>> 2 /* SHIFT_REF */;
/** @type {?} */
let tIcuIndex;
/** @type {?} */
let tIcu;
switch (opCode & 3 /* MASK_OPCODE */) {
case 1 /* Attr */:
/** @type {?} */
const attrName = (/** @type {?} */ (__raw_opCodes[++j]));
/** @type {?} */
const sanitizeFn = __raw_opCodes[++j];
results.push({
__raw_opCode: opCode,
checkBit,
type: 'Attr',
attrValue: value,
attrName,
sanitizeFn,
});
break;
case 0 /* Text */:
results.push({
__raw_opCode: opCode,
checkBit,
type: 'Text',
nodeIndex,
text: value,
});
break;
case 2 /* IcuSwitch */:
tIcuIndex = (/** @type {?} */ (__raw_opCodes[++j]));
tIcu = (/** @type {?} */ (icus))[tIcuIndex];
/** @type {?} */
let result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuSwitch');
result['tIcuIndex'] = tIcuIndex;
result['checkBit'] = checkBit;
result['mainBinding'] = value;
result['tIcu'] = tIcu;
results.push(result);
break;
case 3 /* IcuUpdate */:
tIcuIndex = (/** @type {?} */ (__raw_opCodes[++j]));
tIcu = (/** @type {?} */ (icus))[tIcuIndex];
result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuUpdate');
result['tIcuIndex'] = tIcuIndex;
result['checkBit'] = checkBit;
result['tIcu'] = tIcu;
results.push(result);
break;
}
}
}
}
i += skipCodes;
}
return results;
}
}
if (false) {
/**
* @type {?}
* @private
*/
I18nUpdateOpCodesDebug.prototype.__raw_opCodes;
/**
* @type {?}
* @private
*/
I18nUpdateOpCodesDebug.prototype.icus;
/**
* @type {?}
* @private
*/
I18nUpdateOpCodesDebug.prototype.__lView;
}
/**
* @record
*/
export function I18nOpCodesDebug() { }
if (false) {
/** @type {?} */
I18nOpCodesDebug.prototype.operations;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHZpZXdfZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9sdmlld19kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFZQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxzQkFBc0IsRUFBYyxXQUFXLEVBQUUsTUFBTSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFekgsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQWlGLE1BQU0sb0JBQW9CLENBQUM7QUFLbEosT0FBTyxFQUFDLG9CQUFvQixFQUFFLDZCQUE2QixFQUFFLG9CQUFvQixFQUFFLDZCQUE2QixFQUE2QixNQUFNLHVCQUF1QixDQUFDO0FBQzNLLE9BQU8sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXdDLEtBQUssRUFBRSxhQUFhLEVBQVksSUFBSSxFQUFFLFFBQVEsRUFBcUIsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVMsS0FBSyxFQUFvQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlULE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7O01BRW5ELFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBK0J0RixxQkFBb0Q7O0lBQ3BELG9CQUFtRDs7SUFDbkQsVUFBdUI7Ozs7QUFFM0IseUJBRUM7OztJQURDLDBCQUFnQjs7Ozs7Ozs7O0FBUWxCLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxLQUFZOztVQUNuRCxVQUFVLEdBQUcsbUJBQUEsS0FBSyxFQUFjOztVQUNoQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNyRixPQUFPLG1CQUFBLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFPLENBQUM7QUFDOUMsQ0FBQzs7Ozs7O0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBZSxFQUFFLElBQWlCO0lBQ3pELFFBQVEsSUFBSSxFQUFFO1FBQ1o7WUFDRSxJQUFJLFVBQVUsS0FBSyxTQUFTO2dCQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JGLE9BQU8sVUFBVSxDQUFDO1FBQ3BCO1lBQ0UsSUFBSSxxQkFBcUIsS0FBSyxTQUFTO2dCQUFFLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7O2dCQUN2RSxjQUFjLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxjQUFjLENBQUM7UUFDeEI7WUFDRSxJQUFJLG9CQUFvQixLQUFLLFNBQVM7Z0JBQUUsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Z0JBQ3JFLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2xELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsT0FBTyxhQUFhLENBQUM7S0FDeEI7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDdEMsQ0FBQzs7Ozs7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUEyQjtJQUM3QyxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUM7O1VBQ3RCLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztJQUMzQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7Ozs7Ozs7QUFPRCxNQUFNLE9BQU8sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQ3pDLFlBQ1csSUFBZSxFQUFpQyxFQUFFO0lBQ2xELEVBQVUsRUFBc0MsRUFBRTtJQUNsRCxTQUFnQixFQUFnQyxFQUFFO0lBQ2xELFFBQW9DLEVBQVksRUFBRTtJQUNsRCxPQUFzQixFQUEwQixFQUFFO0lBQ2xELFNBQXVDLEVBQVMsRUFBRTtJQUNsRCxJQUFpQyxFQUFlLEVBQUU7SUFDbEQsSUFBVyxFQUFxQyxFQUFFO0lBQ2xELGlCQUF5QixFQUF1QixFQUFFO0lBQ2xELGlCQUF5QixFQUF1QixFQUFFO0lBQ2xELG1CQUE2QyxFQUFHLEVBQUU7SUFDbEQsZUFBd0IsRUFBd0IsRUFBRTtJQUNsRCxlQUF3QixFQUF3QixFQUFFO0lBQ2xELGlCQUEwQixFQUFzQixFQUFFO0lBQ2xELG9CQUE2QixFQUFtQixFQUFFO0lBQ2xELGFBQTRCLEVBQW9CLEVBQUU7SUFDbEQsa0JBQWlDLEVBQWUsRUFBRTtJQUNsRCxZQUEyQixFQUFxQixFQUFFO0lBQ2xELGlCQUFnQyxFQUFnQixFQUFFO0lBQ2xELFNBQXdCLEVBQXdCLEVBQUU7SUFDbEQsY0FBNkIsRUFBbUIsRUFBRTtJQUNsRCxZQUFrQyxFQUFjLEVBQUU7SUFDbEQsT0FBbUIsRUFBNkIsRUFBRTtJQUNsRCxjQUE2QixFQUFtQixFQUFFO0lBQ2xELFVBQXlCLEVBQXVCLEVBQUU7SUFDbEQsaUJBQXdDLEVBQVEsRUFBRTtJQUNsRCxZQUE4QixFQUFrQixFQUFFO0lBQ2xELFVBQXVCLEVBQXlCLEVBQUU7SUFDbEQsT0FBOEIsRUFBa0IsRUFBRTtJQUNsRCxNQUF1QixFQUF5QixFQUFFO0lBQ2xELG1CQUE0QixDQUFvQixFQUFFOztRQTlCbEQsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFPO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQTRCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQWU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBNkI7UUFDakMsU0FBSSxHQUFKLElBQUksQ0FBTztRQUNYLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUFDekIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUEwQjtRQUM3QyxvQkFBZSxHQUFmLGVBQWUsQ0FBUztRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBUztRQUN4QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVM7UUFDMUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFTO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBZTtRQUNqQyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWU7UUFDaEMsY0FBUyxHQUFULFNBQVMsQ0FBZTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixpQkFBWSxHQUFaLFlBQVksQ0FBc0I7UUFDbEMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBdUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQzlCLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO0lBQ3BDLENBQUM7Ozs7SUFFSixJQUFJLFNBQVM7O2NBQ0wsR0FBRyxHQUFhLEVBQUU7UUFDeEIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQ1QsWUFDVyxNQUFhLEVBQTJELEVBQUU7SUFDMUUsSUFBZSxFQUF5RCxFQUFFO0lBQzFFLEtBQWEsRUFBMkQsRUFBRTtJQUMxRSxhQUFxQixFQUFtRCxFQUFFO0lBQzFFLGNBQXNCLEVBQWtELEVBQUU7SUFDMUUsWUFBb0IsRUFBb0QsRUFBRTtJQUMxRSxvQkFBNEIsRUFBNEMsRUFBRTtJQUMxRSxnQkFBK0IsRUFBeUMsRUFBRTtJQUMxRSxLQUFpQixFQUF1RCxFQUFFO0lBQzFFLGVBQXFDLEVBQW1DLEVBQUU7SUFDMUUsT0FBb0IsRUFBb0QsRUFBRTtJQUMxRSxLQUErRCxFQUFTLEVBQUU7SUFDMUUsV0FBcUUsRUFBRyxFQUFFO0lBQzFFLFVBQWtDLEVBQXNDLEVBQUU7SUFDMUUsYUFBK0MsRUFBeUIsRUFBRTtJQUMxRSxNQUE0QixFQUE0QyxFQUFFO0lBQzFFLE9BQTZCLEVBQTJDLEVBQUU7SUFDMUUsTUFBNEIsRUFBNEMsRUFBRTtJQUMxRSxJQUFpQixFQUF1RCxFQUFFO0lBQzFFLGNBQTJCLEVBQTZDLEVBQUU7SUFDMUUsS0FBa0IsRUFBc0QsRUFBRTtJQUMxRSxNQUF3QyxFQUFnQyxFQUFFO0lBQzFFLFVBQTBDLEVBQThCLEVBQUU7SUFDMUUsTUFBbUIsRUFBcUQsRUFBRTtJQUMxRSxpQkFBOEIsRUFBMEMsRUFBRTtJQUMxRSxjQUFpRCxFQUF1QixFQUFFO0lBQzFFLE9BQW9CLEVBQW9ELEVBQUU7SUFDMUUsa0JBQStCLEVBQXlDLEVBQUU7SUFDMUUsZUFBa0QsRUFBc0IsRUFBRTtJQUMxRSxhQUE0QixFQUE0QyxFQUFFO0lBQzFFLGFBQTRCO1FBOUI1QixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVE7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBQy9CLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsb0JBQWUsR0FBZixlQUFlLENBQXNCO1FBQ3JDLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBMEQ7UUFDL0QsZ0JBQVcsR0FBWCxXQUFXLENBQTBEO1FBQ3JFLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQUMvQyxXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQUM1QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQUM1QixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLG1CQUFjLEdBQWQsY0FBYyxDQUFhO1FBQzNCLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0M7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBZ0M7UUFDMUMsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWE7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQW1DO1FBQ2pELFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFhO1FBQy9CLG9CQUFlLEdBQWYsZUFBZSxDQUFtQztRQUNsRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUNwQyxDQUFDOzs7O0lBRUosSUFBSSxLQUFLO1FBQ1AsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCO2dCQUNFLE9BQU8scUJBQXFCLENBQUM7WUFDL0I7Z0JBQ0UsT0FBTyxtQkFBbUIsQ0FBQztZQUM3QjtnQkFDRSxPQUFPLDRCQUE0QixDQUFDO1lBQ3RDO2dCQUNFLE9BQU8sd0JBQXdCLENBQUM7WUFDbEM7Z0JBQ0UsT0FBTyxzQkFBc0IsQ0FBQztZQUNoQztnQkFDRSxPQUFPLGdCQUFnQixDQUFDO1lBQzFCO2dCQUNFLE9BQU8sZUFBZSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7OztJQUVELElBQUksTUFBTTs7Y0FDRixLQUFLLEdBQWEsRUFBRTtRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLHlCQUEyQjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQyxLQUFLLDBCQUE2QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksQ0FBQyxLQUFLLHlCQUEyQjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQyxLQUFLLDRCQUE2QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksQ0FBQyxLQUFLLDBCQUE2QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksQ0FBQyxLQUFLLDBCQUE2QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksQ0FBQyxLQUFLLHNCQUF3QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxLQUFLLHNCQUF5QjtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5RSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7OztJQUVELElBQUksU0FBUzs7Y0FDTCxHQUFHLEdBQWEsRUFBRTtRQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUc7O3NCQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxPQUFPLFFBQVEsSUFBSSxRQUFRLEVBQUU7b0JBQy9CLE1BQU07aUJBQ1A7O3NCQUNLLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBQSxRQUFRLEVBQVUsRUFBRSxJQUFJLEVBQUUsbUJBQUEsU0FBUyxFQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDbkU7U0FDRjtRQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQzs7OztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDOzs7O0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRjs7O0lBMUZLLHVCQUFvQjs7SUFDcEIscUJBQXNCOztJQUN0QixzQkFBb0I7O0lBQ3BCLDhCQUE0Qjs7SUFDNUIsK0JBQTZCOztJQUM3Qiw2QkFBMkI7O0lBQzNCLHFDQUFtQzs7SUFDbkMsaUNBQXNDOztJQUN0QyxzQkFBd0I7O0lBQ3hCLGdDQUE0Qzs7SUFDNUMsd0JBQTJCOztJQUMzQixzQkFBc0U7O0lBQ3RFLDRCQUE0RTs7SUFDNUUsMkJBQXlDOztJQUN6Qyw4QkFBc0Q7O0lBQ3RELHVCQUFtQzs7SUFDbkMsd0JBQW9DOztJQUNwQyx1QkFBbUM7O0lBQ25DLHFCQUF3Qjs7SUFDeEIsK0JBQWtDOztJQUNsQyxzQkFBeUI7O0lBQ3pCLHVCQUErQzs7SUFDL0MsMkJBQWlEOztJQUNqRCx1QkFBMEI7O0lBQzFCLGtDQUFxQzs7SUFDckMsK0JBQXdEOztJQUN4RCx3QkFBMkI7O0lBQzNCLG1DQUFzQzs7SUFDdEMsZ0NBQXlEOztJQUN6RCw4QkFBbUM7O0lBQ25DLDhCQUFtQzs7O0FBNkR6QyxNQUFNLE9BQU8sVUFBVSxHQUFHLEtBQUs7Ozs7QUFHL0Isd0NBQzhEOzs7O0FBQzlELHVDQVFDOzs7SUFQQyxnQ0FBaUI7O0lBQ2pCLGtDQUFjOztJQUNkLHVDQUFvQjs7SUFDcEIsMENBQXVCOztJQUN2QiwwQ0FBdUI7O0lBQ3ZCLHNDQUFrQjs7SUFDbEIsc0NBQWtCOzs7Ozs7O0FBR3BCLFNBQVMsbUJBQW1CLENBQUMsS0FBWSxFQUFFLFlBQXFCOztVQUN4RCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJOztVQUN6QixRQUFRLEdBQXVCLG1CQUFBLEVBQUUsRUFBTzs7VUFDeEMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWE7O1VBQ2hFLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7O1VBQ2xDLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7O1FBQ3BDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQzs7UUFDdkIsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO0lBQ3JDLE9BQU8sTUFBTSxLQUFLLENBQUMsRUFBRTs7Y0FDYixPQUFPLEdBQUcsbUJBQUEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFlOztjQUN0QyxTQUFTLEdBQUcsbUJBQUEsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBaUI7UUFDcEQsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNmLEdBQUcsRUFBRSxPQUFPO1lBQ1osS0FBSyxFQUFFLE1BQU07WUFDYixVQUFVLEVBQUUsVUFBVTtZQUN0QixhQUFhLEVBQUUsNkJBQTZCLENBQUMsU0FBUyxDQUFDO1lBQ3ZELGFBQWEsRUFBRSw2QkFBNkIsQ0FBQyxTQUFTLENBQUM7WUFDdkQsU0FBUyxFQUFFLG9CQUFvQ