diff --git a/scripts/publish-profiler-cli.mjs b/scripts/publish-profiler-cli.mjs
index d37171f35d..6340cba241 100644
--- a/scripts/publish-profiler-cli.mjs
+++ b/scripts/publish-profiler-cli.mjs
@@ -26,5 +26,5 @@ function run(cmd, args) {
}
run('yarn', ['test-all']);
-run('yarn', ['build-profiler-cli']);
+run('yarn', ['build-cli']);
run('npm', ['publish', 'profiler-cli/', ...tagArgs, ...forwardedArgs]);
diff --git a/scripts/verify-profiler-cli-build.mjs b/scripts/verify-profiler-cli-build.mjs
index cd9fe40460..9c9db90f1e 100644
--- a/scripts/verify-profiler-cli-build.mjs
+++ b/scripts/verify-profiler-cli-build.mjs
@@ -14,7 +14,7 @@ const distPath = fileURLToPath(distUrl);
if (!existsSync(distUrl)) {
console.error(
`profiler-cli bundle not found at ${distPath}.\n` +
- `Run 'yarn build-profiler-cli' from the repo root before publishing.`
+ `Run 'yarn build-cli' from the repo root before publishing.`
);
process.exit(1);
}
@@ -26,7 +26,7 @@ const needle = JSON.stringify(version);
if (!bundle.includes(needle)) {
console.error(
`profiler-cli bundle does not embed the current package.json version (${version}).\n` +
- `The bundle is stale — rebuild with 'yarn build-profiler-cli' from the repo root.`
+ `The bundle is stale — rebuild with 'yarn build-cli' from the repo root.`
);
process.exit(1);
}
diff --git a/src/app-logic/constants.ts b/src/app-logic/constants.ts
index 2979163779..e775888590 100644
--- a/src/app-logic/constants.ts
+++ b/src/app-logic/constants.ts
@@ -7,12 +7,12 @@ import type { MarkerPhase } from 'firefox-profiler/types';
// The current version of the Gecko profile format.
// Please don't forget to update the gecko profile format changelog in
// `docs-developer/CHANGELOG-formats.md`.
-export const GECKO_PROFILE_VERSION = 34;
+export const GECKO_PROFILE_VERSION = 35;
// The current version of the "processed" profile format.
// Please don't forget to update the processed profile format changelog in
// `docs-developer/CHANGELOG-formats.md`.
-export const PROCESSED_PROFILE_VERSION = 66;
+export const PROCESSED_PROFILE_VERSION = 68;
// The following are the margin sizes for the left and right of the timeline. Independent
// components need to share these values.
diff --git a/src/components/app/Details.css b/src/components/app/Details.css
index 43a051246c..b85be0fc03 100644
--- a/src/components/app/Details.css
+++ b/src/components/app/Details.css
@@ -5,8 +5,12 @@
display: flex;
/* If .Details is squished to a very small size between the sidebar and/or bottom bar,
- don't spill out our contents over those other elements. */
+ don't spill out our contents over those other elements. overflow: clip isn't a
+ scroll container though, so it doesn't zero out the flex automatic minimum size:
+ without min-width: 0, a wide child forces .Details past its container width and
+ overflows the whole viewport. */
overflow: clip;
+ min-width: 0;
flex: 1;
flex-direction: column;
}
diff --git a/src/components/shared/ContextMenu.css b/src/components/shared/ContextMenu.css
index 25931c5f39..756fcd0b12 100644
--- a/src/components/shared/ContextMenu.css
+++ b/src/components/shared/ContextMenu.css
@@ -141,8 +141,8 @@
}
.react-contextmenu-item--selected.checked:not(
- .react-contextmenu-item--disabled
- )::before {
+ .react-contextmenu-item--disabled
+)::before {
/* Invert the colors of the checkmark when selected */
border-color: var(--internal-active-foreground-color);
}
diff --git a/src/components/shared/FilterNavigatorBar.css b/src/components/shared/FilterNavigatorBar.css
index d961dc98ac..5a8cb08484 100644
--- a/src/components/shared/FilterNavigatorBar.css
+++ b/src/components/shared/FilterNavigatorBar.css
@@ -127,16 +127,16 @@
.filterNavigatorBarItem:not(.filterNavigatorBarLeafItem):hover,
.filterNavigatorBarItem:has(
- .profileFilterNavigator--tab-selector.button
- ):hover {
+ .profileFilterNavigator--tab-selector.button
+):hover {
background-color: var(--internal-hover-background-color);
color: var(--internal-hover-color);
}
.filterNavigatorBarItem:not(
- .filterNavigatorBarRootItem,
- .filterNavigatorBarLeafItem
- ):hover::before,
+ .filterNavigatorBarRootItem,
+ .filterNavigatorBarLeafItem
+):hover::before,
.filterNavigatorBarItem:not(.filterNavigatorBarLeafItem):hover::after {
border-color: var(--internal-hover-background-color);
}
@@ -146,9 +146,9 @@
}
.filterNavigatorBarItem:not(
- .filterNavigatorBarRootItem,
- .filterNavigatorBarLeafItem
- ):active:hover::before,
+ .filterNavigatorBarRootItem,
+ .filterNavigatorBarLeafItem
+):active:hover::before,
.filterNavigatorBarItem:not(.filterNavigatorBarLeafItem):active:hover::after {
border-color: var(--internal-active-background-color);
}
diff --git a/src/components/shared/TabSelectorMenu.css b/src/components/shared/TabSelectorMenu.css
index 831cf44fd8..6fd4907d21 100644
--- a/src/components/shared/TabSelectorMenu.css
+++ b/src/components/shared/TabSelectorMenu.css
@@ -15,8 +15,8 @@
}
.react-contextmenu-item.tabSelectorMenuItem.checked:not(
- .react-contextmenu-item--disabled
- )::before {
+ .react-contextmenu-item--disabled
+)::before {
/* Move the checkmark to inline-start instead of right, as it's logically better. */
inset-inline: 8px 0;
}
diff --git a/src/components/sidebar/sidebar.css b/src/components/sidebar/sidebar.css
index 8e3e1c4bfd..8306a920db 100644
--- a/src/components/sidebar/sidebar.css
+++ b/src/components/sidebar/sidebar.css
@@ -26,12 +26,9 @@
align-items: center;
gap: 2px 5px;
grid-template-columns:
- /* Label */
- 1fr
- /* Value */
- min-content
- /* Percentage */
- min-content;
+ /* Label */ 1fr
+ /* Value */ min-content
+ /* Percentage */ min-content;
}
.sidebar-titlegroup,
diff --git a/src/components/tooltip/Marker.tsx b/src/components/tooltip/Marker.tsx
index 613df41c92..a7728ca21a 100644
--- a/src/components/tooltip/Marker.tsx
+++ b/src/components/tooltip/Marker.tsx
@@ -580,8 +580,10 @@ class MarkerTooltipContents extends React.PureComponent
{
}
}
-// This regexp is used to test for URLs and remove their scheme for display.
-const URL_SCHEME_REGEXP = /^http(s?):\/\//;
+// Matches a value that is *entirely* a single http(s) URL. We only render a
+// clickable link when the whole string is a URL, so a longer descriptive
+// string is never turned into a broken link.
+const URL_REGEXP = /^(https?:\/\/)\S+$/;
/**
* This function may return structured markup for some types suchs as table,
@@ -689,7 +691,8 @@ export function renderMarkerFieldValue(
);
case 'url': {
- if (!URL_SCHEME_REGEXP.test(value)) {
+ const match = URL_REGEXP.exec(value);
+ if (!match) {
return value;
}
return (
@@ -699,7 +702,7 @@ export function renderMarkerFieldValue(
rel="noreferrer"
className="marker-link-value"
>
- {value.replace(URL_SCHEME_REGEXP, '')}
+ {value.slice(match[1].length)}
);
}
diff --git a/src/node-tools/profiler-edit.ts b/src/node-tools/profiler-edit.ts
index ed67f35e43..2dba4034d3 100644
--- a/src/node-tools/profiler-edit.ts
+++ b/src/node-tools/profiler-edit.ts
@@ -11,6 +11,7 @@ import {
import { parse as parseToml } from 'smol-toml';
import {
+ optimizeProfileForStorage,
serializeProfileToJsonSlabsFile,
serializeProfileToJsonString,
unserializeProfileOfArbitraryFormat,
@@ -205,7 +206,9 @@ async function encodeProfileWithFilename(
filename: string
): Promise {
if (filename.endsWith('.jslb') || filename.endsWith('.jslb.gz')) {
- const bytes = serializeProfileToJsonSlabsFile(profile);
+ const bytes = serializeProfileToJsonSlabsFile(
+ optimizeProfileForStorage(profile)
+ );
if (filename.endsWith('.jslb.gz')) {
return compress(bytes);
}
diff --git a/src/profile-logic/combined-cpu.ts b/src/profile-logic/combined-cpu.ts
index a7a7efa163..6966e779f3 100644
--- a/src/profile-logic/combined-cpu.ts
+++ b/src/profile-logic/combined-cpu.ts
@@ -2,14 +2,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import type { SamplesTable } from 'firefox-profiler/types';
+import type { Milliseconds, SamplesTable } from 'firefox-profiler/types';
import { bisectionLeft } from '../utils/bisect';
/**
* Represents CPU usage over time for a single thread.
*/
export type CpuRatioTimeSeries = {
- time: number[];
+ time: Float64Array;
cpuRatio: Float64Array;
maxCpuRatio: number;
length: number;
@@ -87,7 +87,7 @@ export function combineCPUDataFromThreads(
}
const cursors = new Array(threadsWithCPU.length).fill(0);
- const combinedTime: number[] = [];
+ const combinedTime: Milliseconds[] = [];
const combinedCPURatio: number[] = [];
let combinedMaxCpuRatio = 0;
@@ -126,7 +126,7 @@ export function combineCPUDataFromThreads(
}
return {
- time: combinedTime,
+ time: Float64Array.from(combinedTime),
cpuRatio: Float64Array.from(combinedCPURatio),
maxCpuRatio: combinedMaxCpuRatio,
length: combinedTime.length,
diff --git a/src/profile-logic/cpu.ts b/src/profile-logic/cpu.ts
index 4ed904bc5c..4048a0d0de 100644
--- a/src/profile-logic/cpu.ts
+++ b/src/profile-logic/cpu.ts
@@ -103,7 +103,7 @@ export function computeReferenceCPUDeltaPerMs(profile: Profile): number {
*/
export function computeThreadCPUPercent(
threadCPUDelta: Array,
- timeDeltas: number[],
+ timeDeltas: number[] | Float64Array,
referenceCPUDeltaPerMs: number
): Uint8Array {
const threadCPUPercent: Uint8Array = new Uint8Array(
diff --git a/src/profile-logic/data-structures.ts b/src/profile-logic/data-structures.ts
index 476745de1a..1aa38d66fd 100644
--- a/src/profile-logic/data-structures.ts
+++ b/src/profile-logic/data-structures.ts
@@ -11,13 +11,13 @@ import type {
RawProfileSharedData,
RawThread,
RawSamplesTable,
- FrameTable,
+ RawFrameTable,
RawStackTable,
+ RawJsAllocationsTable,
+ RawUnbalancedNativeAllocationsTable,
+ RawBalancedNativeAllocationsTable,
FuncTable,
RawMarkerTable,
- JsAllocationsTable,
- UnbalancedNativeAllocationsTable,
- BalancedNativeAllocationsTable,
ResourceTable,
NativeSymbolTable,
Profile,
@@ -28,14 +28,114 @@ import type {
SourceTable,
SourceLocationTable,
IndexIntoFrameTable,
+ IndexIntoFuncTable,
IndexIntoStackTable,
+ IndexIntoStringTable,
+ IndexIntoCategoryList,
+ IndexIntoSubcategoryListForCategory,
+ IndexIntoNativeSymbolTable,
+ IndexIntoSourceLocationTable,
+ InnerWindowID,
+ Address,
+ Bytes,
+ Milliseconds,
+ Tid,
+ MarkerPhase,
+ MarkerPayload,
+ WeightType,
} from 'firefox-profiler/types';
+/**
+ * Builder-variants of various tables. The columns here use plain
+ * arrays so that elements can be added one-by-one by pushing to
+ * the column arrays.
+ *
+ * The "raw" variants of these arrays (i.e. what's stored in the
+ * profile files) may be using typed arrays for some of the columns,
+ * and you can't push to a typed array.
+ */
+export type RawSamplesTableBuilder = {
+ responsiveness?: Array;
+ eventDelay?: Array;
+ stack: Array;
+ time?: Milliseconds[];
+ timeDeltas?: Milliseconds[];
+ argumentValues?: Array;
+ weight: null | number[];
+ weightType: WeightType;
+ threadCPUDelta?: Array;
+ threadId?: Tid[];
+ length: number;
+};
+
+export type RawMarkerTableBuilder = {
+ data: Array;
+ name: IndexIntoStringTable[];
+ startTime: Array;
+ endTime: Array;
+ phase: MarkerPhase[];
+ category: IndexIntoCategoryList[];
+ threadId?: Array;
+ length: number;
+};
+
+export type RawJsAllocationsTableBuilder = {
+ time: Milliseconds[];
+ className: string[];
+ typeName: string[];
+ coarseType: string[];
+ weight: Bytes[];
+ weightType: 'bytes';
+ inNursery: boolean[];
+ stack: Array;
+ length: number;
+};
+
+export type RawUnbalancedNativeAllocationsTableBuilder = {
+ time: Milliseconds[];
+ weight: Bytes[];
+ weightType: 'bytes';
+ stack: Array;
+ argumentValues?: Array;
+ length: number;
+};
+
+export type RawBalancedNativeAllocationsTableBuilder = {
+ time: Milliseconds[];
+ weight: Bytes[];
+ weightType: 'bytes';
+ stack: Array;
+ argumentValues?: Array;
+ memoryAddress: number[];
+ threadId: number[];
+ length: number;
+};
+
+export type RawFrameTableBuilder = {
+ address: Array;
+ inlineDepth: number[];
+ category: (IndexIntoCategoryList | null)[];
+ subcategory: (IndexIntoSubcategoryListForCategory | null)[];
+ func: IndexIntoFuncTable[];
+ nativeSymbol: (IndexIntoNativeSymbolTable | null)[];
+ innerWindowID: (InnerWindowID | null)[];
+ line: (number | null)[];
+ column: (number | null)[];
+ originalLocation: Array;
+ length: number;
+};
+
+export type RawStackTableBuilder = {
+ frame: IndexIntoFrameTable[];
+ prefix: Array;
+ length: number;
+};
+
/**
* This module collects all of the creation of new empty profile data structures.
*/
-export function getEmptySamplesTable(): RawSamplesTable {
+export function getRawSamplesTableBuilder(): RawSamplesTableBuilder {
return {
// Important!
// If modifying this structure, please update all callers of this function to ensure
@@ -49,12 +149,6 @@ export function getEmptySamplesTable(): RawSamplesTable {
};
}
-export type RawStackTableBuilder = {
- frame: IndexIntoFrameTable[];
- prefix: Array;
- length: number;
-};
-
export function getRawStackTableBuilder(): RawStackTableBuilder {
return {
// Important!
@@ -67,6 +161,72 @@ export function getRawStackTableBuilder(): RawStackTableBuilder {
};
}
+export function getRawSamplesTableBuilderFromExisting(
+ existing: RawSamplesTable
+): RawSamplesTableBuilder {
+ const builder: RawSamplesTableBuilder = {
+ stack: existing.stack.slice(),
+ weight: existing.weight === null ? null : existing.weight.slice(),
+ weightType: existing.weightType,
+ length: existing.length,
+ };
+ if (existing.responsiveness !== undefined) {
+ builder.responsiveness = existing.responsiveness.slice();
+ }
+ if (existing.eventDelay !== undefined) {
+ builder.eventDelay = existing.eventDelay.slice();
+ }
+ if (existing.time !== undefined) {
+ builder.time = Array.from(existing.time);
+ }
+ if (existing.timeDeltas !== undefined) {
+ builder.timeDeltas = Array.from(existing.timeDeltas);
+ }
+ if (existing.argumentValues !== undefined) {
+ builder.argumentValues = existing.argumentValues.slice();
+ }
+ if (existing.threadCPUDelta !== undefined) {
+ builder.threadCPUDelta = existing.threadCPUDelta.slice();
+ }
+ return builder;
+}
+
+export function finishRawSamplesTableBuilder(
+ builder: RawSamplesTableBuilder
+): RawSamplesTable {
+ return {
+ ...builder,
+ time:
+ builder.time === undefined ? undefined : new Float64Array(builder.time),
+ timeDeltas:
+ builder.timeDeltas === undefined
+ ? undefined
+ : new Float64Array(builder.timeDeltas),
+ };
+}
+
+export function getRawMarkerTableBuilderFromExisting(
+ markerTable: RawMarkerTable
+): RawMarkerTableBuilder {
+ const builder: RawMarkerTableBuilder = {
+ // Important!
+ // If modifying this structure, please update all callers of this function to ensure
+ // that they are pushing on correctly to the data structure. These pushes may not
+ // be caught by the type system.
+ data: markerTable.data.slice(),
+ name: markerTable.name.slice(),
+ startTime: Array.from(markerTable.startTime),
+ endTime: Array.from(markerTable.endTime),
+ phase: markerTable.phase.slice(),
+ category: markerTable.category.slice(),
+ length: markerTable.length,
+ };
+ if (markerTable.threadId !== undefined) {
+ builder.threadId = markerTable.threadId.slice();
+ }
+ return builder;
+}
+
export function getRawStackTableBuilderWithExistingContents(
existing: RawStackTable
): RawStackTableBuilder {
@@ -103,7 +263,7 @@ export function finishRawStackTableBuilder(
* eventDelay is a new field and it replaced responsiveness. We should still
* account for older profiles and use both of the flavors if needed.
*/
-export function getEmptySamplesTableWithEventDelay(): RawSamplesTable {
+export function getRawSamplesTableBuilderWithEventDelay(): RawSamplesTableBuilder {
return {
// Important!
// If modifying this structure, please update all callers of this function to ensure
@@ -118,7 +278,7 @@ export function getEmptySamplesTableWithEventDelay(): RawSamplesTable {
};
}
-export function getEmptyFrameTable(): FrameTable {
+export function getRawFrameTableBuilder(): RawFrameTableBuilder {
return {
// Important!
// If modifying this structure, please update all callers of this function to ensure
@@ -138,17 +298,19 @@ export function getEmptyFrameTable(): FrameTable {
};
}
-export function shallowCloneFrameTable(frameTable: FrameTable): FrameTable {
+export function getRawFrameTableBuilderWithExistingContents(
+ frameTable: RawFrameTable
+): RawFrameTableBuilder {
return {
// Important!
// If modifying this structure, please update all callers of this function to ensure
// that they are pushing on correctly to the data structure. These pushes may not
// be caught by the type system.
- address: frameTable.address.slice(),
- inlineDepth: frameTable.inlineDepth.slice(),
+ address: Array.from(frameTable.address),
+ inlineDepth: Array.from(frameTable.inlineDepth),
category: frameTable.category.slice(),
subcategory: frameTable.subcategory.slice(),
- func: frameTable.func.slice(),
+ func: Array.from(frameTable.func),
nativeSymbol: frameTable.nativeSymbol.slice(),
innerWindowID: frameTable.innerWindowID.slice(),
line: frameTable.line.slice(),
@@ -158,6 +320,17 @@ export function shallowCloneFrameTable(frameTable: FrameTable): FrameTable {
};
}
+export function finishRawFrameTableBuilder(
+ builder: RawFrameTableBuilder
+): RawFrameTable {
+ return {
+ ...builder,
+ address: new Int32Array(builder.address),
+ inlineDepth: new Uint8Array(builder.inlineDepth),
+ func: new Int32Array(builder.func),
+ };
+}
+
export function getEmptyFuncTable(): FuncTable {
return {
// Important!
@@ -258,7 +431,7 @@ export function getEmptyNativeSymbolTable(): NativeSymbolTable {
};
}
-export function getEmptyRawMarkerTable(): RawMarkerTable {
+export function getEmptyRawMarkerTable(): RawMarkerTableBuilder {
// Important!
// If modifying this structure, please update all callers of this function to ensure
// that they are pushing on correctly to the data structure. These pushes may not
@@ -274,7 +447,7 @@ export function getEmptyRawMarkerTable(): RawMarkerTable {
};
}
-export function getEmptyJsAllocationsTable(): JsAllocationsTable {
+export function getEmptyRawJsAllocationsTable(): RawJsAllocationsTableBuilder {
// Important!
// If modifying this structure, please update all callers of this function to ensure
// that they are pushing on correctly to the data structure. These pushes may not
@@ -296,7 +469,7 @@ export function getEmptyJsAllocationsTable(): JsAllocationsTable {
* The native allocation tables come in two varieties. Get one of the members of the
* union.
*/
-export function getEmptyUnbalancedNativeAllocationsTable(): UnbalancedNativeAllocationsTable {
+export function getEmptyRawUnbalancedNativeAllocationsTable(): RawUnbalancedNativeAllocationsTableBuilder {
// Important!
// If modifying this structure, please update all callers of this function to ensure
// that they are pushing on correctly to the data structure. These pushes may not
@@ -314,7 +487,7 @@ export function getEmptyUnbalancedNativeAllocationsTable(): UnbalancedNativeAllo
* The native allocation tables come in two varieties. Get one of the members of the
* union.
*/
-export function getEmptyBalancedNativeAllocationsTable(): BalancedNativeAllocationsTable {
+export function getEmptyRawBalancedNativeAllocationsTable(): RawBalancedNativeAllocationsTableBuilder {
// Important!
// If modifying this structure, please update all callers of this function to ensure
// that they are pushing on correctly to the data structure. These pushes may not
@@ -330,21 +503,30 @@ export function getEmptyBalancedNativeAllocationsTable(): BalancedNativeAllocati
};
}
-export function shallowCloneRawMarkerTable(
- markerTable: RawMarkerTable
-): RawMarkerTable {
+export function finishRawJsAllocationsTableBuilder(
+ builder: RawJsAllocationsTableBuilder
+): RawJsAllocationsTable {
return {
- // Important!
- // If modifying this structure, please update all callers of this function to ensure
- // that they are pushing on correctly to the data structure. These pushes may not
- // be caught by the type system.
- data: markerTable.data.slice(),
- name: markerTable.name.slice(),
- startTime: markerTable.startTime.slice(),
- endTime: markerTable.endTime.slice(),
- phase: markerTable.phase.slice(),
- category: markerTable.category.slice(),
- length: markerTable.length,
+ ...builder,
+ time: new Float64Array(builder.time),
+ };
+}
+
+export function finishRawUnbalancedNativeAllocationsTableBuilder(
+ builder: RawUnbalancedNativeAllocationsTableBuilder
+): RawUnbalancedNativeAllocationsTable {
+ return {
+ ...builder,
+ time: new Float64Array(builder.time),
+ };
+}
+
+export function finishRawBalancedNativeAllocationsTableBuilder(
+ builder: RawBalancedNativeAllocationsTableBuilder
+): RawBalancedNativeAllocationsTable {
+ return {
+ ...builder,
+ time: new Float64Array(builder.time),
};
}
@@ -420,7 +602,9 @@ export function getEmptyThread(overrides?: Partial): RawThread {
pid: '0',
tid: 0,
// Creating samples with event delay since it's the new samples table.
- samples: getEmptySamplesTableWithEventDelay(),
+ samples: finishRawSamplesTableBuilder(
+ getRawSamplesTableBuilderWithEventDelay()
+ ),
markers: getEmptyRawMarkerTable(),
};
@@ -433,7 +617,7 @@ export function getEmptyThread(overrides?: Partial): RawThread {
export function getEmptySharedData(): RawProfileSharedData {
return {
stackTable: finishRawStackTableBuilder(getRawStackTableBuilder()),
- frameTable: getEmptyFrameTable(),
+ frameTable: finishRawFrameTableBuilder(getRawFrameTableBuilder()),
funcTable: getEmptyFuncTable(),
resourceTable: getEmptyResourceTable(),
nativeSymbols: getEmptyNativeSymbolTable(),
diff --git a/src/profile-logic/gecko-profile-versioning.ts b/src/profile-logic/gecko-profile-versioning.ts
index 38923e9c45..d796b1cdef 100644
--- a/src/profile-logic/gecko-profile-versioning.ts
+++ b/src/profile-logic/gecko-profile-versioning.ts
@@ -495,7 +495,7 @@ const _upgraders: {
frame[schemaIndexCategory] =
oldCategoryToNewCategory[frame[schemaIndexCategory]];
} else {
- frame[schemaIndexCategory] = 1 /* Other*/;
+ frame[schemaIndexCategory] = 1; /* Other*/
}
}
}
@@ -1463,7 +1463,13 @@ const _upgraders: {
// upgraded counters; ignore them.
continue;
}
- counter.samples = counter.sample_groups[0].samples;
+ // A counter that collected no data has an empty sample_groups array
+ // (see the version 18 upgrader), so fall back to an empty samples
+ // table when there is no group to unwrap.
+ counter.samples =
+ counter.sample_groups.length > 0
+ ? counter.sample_groups[0].samples
+ : { schema: { time: 0, count: 1, number: 2 }, data: [] };
delete counter.sample_groups;
}
}
@@ -1557,6 +1563,13 @@ const _upgraders: {
}
convertToVersion34Recursive(profile);
},
+ [35]: (_: any) => {
+ // This version bump added a new marker schema format type, named "hexadecimal",
+ // which older frontends will not be able to display.
+ // No upgrade is needed, as older versions of firefox would not generate
+ // marker data with hexadecimal typed data, and no modification is needed in the
+ // frontend to display older formats.
+ },
// If you add a new upgrader here, please document the change in
// `docs-developer/CHANGELOG-formats.md`.
diff --git a/src/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts
index c52e170293..03333b58c7 100644
--- a/src/profile-logic/global-data-collector.ts
+++ b/src/profile-logic/global-data-collector.ts
@@ -4,8 +4,9 @@
import { StringTable } from '../utils/string-table';
import {
+ finishRawFrameTableBuilder,
finishRawStackTableBuilder,
- getEmptyFrameTable,
+ getRawFrameTableBuilder,
getEmptyFuncTable,
getEmptyNativeSymbolTable,
getEmptyResourceTable,
@@ -22,7 +23,6 @@ import type {
IndexIntoSourceTable,
RawProfileSharedData,
SourceTable,
- FrameTable,
FuncTable,
ResourceTable,
NativeSymbolTable,
@@ -34,7 +34,10 @@ import type {
Bytes,
} from 'firefox-profiler/types';
import { ResourceType } from 'firefox-profiler/types';
-import type { RawStackTableBuilder } from './data-structures';
+import type {
+ RawFrameTableBuilder,
+ RawStackTableBuilder,
+} from './data-structures';
/**
* GlobalDataCollector collects data which is global in the processed profile
@@ -50,7 +53,7 @@ export class GlobalDataCollector {
_stringArray: string[] = [];
_stringTable: StringTable = StringTable.withBackingArray(this._stringArray);
_sources: SourceTable = getEmptySourceTable();
- _frameTable: FrameTable = getEmptyFrameTable();
+ _frameTable: RawFrameTableBuilder = getRawFrameTableBuilder();
_stackTableBuilder: RawStackTableBuilder = getRawStackTableBuilder();
_funcTable: FuncTable = getEmptyFuncTable();
_resourceTable: ResourceTable = getEmptyResourceTable();
@@ -299,7 +302,7 @@ export class GlobalDataCollector {
return this._stringTable;
}
- getFrameTable(): FrameTable {
+ getFrameTable(): RawFrameTableBuilder {
return this._frameTable;
}
@@ -312,7 +315,7 @@ export class GlobalDataCollector {
finish(): { libs: Lib[]; shared: RawProfileSharedData } {
const shared: RawProfileSharedData = {
stackTable: finishRawStackTableBuilder(this._stackTableBuilder),
- frameTable: this._frameTable,
+ frameTable: finishRawFrameTableBuilder(this._frameTable),
funcTable: this._funcTable,
resourceTable: this._resourceTable,
nativeSymbols: this._nativeSymbols,
diff --git a/src/profile-logic/import/chrome.ts b/src/profile-logic/import/chrome.ts
index fefc76f986..0a448666e0 100644
--- a/src/profile-logic/import/chrome.ts
+++ b/src/profile-logic/import/chrome.ts
@@ -10,8 +10,13 @@ import type {
} from 'firefox-profiler/types';
import {
+ finishRawSamplesTableBuilder,
getEmptyProfile,
getEmptyThread,
+ getRawSamplesTableBuilderWithEventDelay,
+ getRawMarkerTableBuilderFromExisting,
+ type RawMarkerTableBuilder,
+ type RawSamplesTableBuilder,
type RawStackTableBuilder,
} from '../data-structures';
import type { StringTable } from '../../utils/string-table';
@@ -42,6 +47,7 @@ export type TracingEventUnion =
| ThreadSortIndexEvent
| ScreenshotEvent
| FallbackEndEvent
+ | ScriptCatchupEvent
| TracingStartedInBrowserEvent;
type TracingEvent = {
@@ -183,6 +189,27 @@ type TracingStartedInBrowserEvent = TracingEvent<{
ph: 'I';
}>;
+// Emitted for every parsed script when a trace is recorded with the
+// "disabled-by-default-devtools.v8-source-rundown" category (the DevTools
+// Performance panel enables it by default). This is the only place a Chrome
+// trace exposes the source map URL for a script. The CPU profile callFrames
+// don't carry it (for now?).
+type ScriptCatchupEvent = TracingEvent<{
+ name: 'ScriptCatchup';
+ args: {
+ data: {
+ executionContextId: number;
+ hasSourceUrl: boolean;
+ isModule: boolean;
+ isolate: string;
+ scriptId: number;
+ url?: string;
+ // The source map URL as declared by the script, often relative to `url`.
+ sourceMapUrl?: string;
+ };
+ };
+}>;
+
function wrapCpuProfileInEvent(cpuProfile: CpuProfileData): CpuProfileEvent {
return {
name: 'CpuProfile',
@@ -270,6 +297,8 @@ export function attemptToConvertChromeProfile(
type ThreadInfo = {
thread: RawThread;
+ samples: RawSamplesTableBuilder;
+ markers: RawMarkerTableBuilder;
nodeIdToStackId: Map;
lastSeenTime: number;
lastSampledTime: number;
@@ -316,7 +345,8 @@ function getThreadInfo(
if (cachedThreadInfo) {
return cachedThreadInfo;
}
- const thread = getEmptyThread();
+ const samples = getRawSamplesTableBuilderWithEventDelay();
+ const thread = getEmptyThread({ samples });
thread.pid = `${chunk.pid}`;
// It looks like the TID information in Chrome's data isn't the system's TID
// but some internal values only unique for a pid. Therefore let's generate a
@@ -399,8 +429,13 @@ function getThreadInfo(
const nodeIdToStackId = new Map();
nodeIdToStackId.set(undefined, null);
+ const markers = getRawMarkerTableBuilderFromExisting(thread.markers);
+ thread.markers = markers;
+
const threadInfo: ThreadInfo = {
thread,
+ samples,
+ markers,
nodeIdToStackId,
lastSeenTime: chunk.ts / 1000,
lastSampledTime: 0,
@@ -519,6 +554,21 @@ async function processTracingEvents(
ensureExists(profile.meta.categories)
);
+ // Build a lookup from script URL to its source map URL from any ScriptCatchup
+ // events in the trace. The declared source map URL is often relative to the
+ // script URL which matches how Gecko profiles store this column.
+ // Keyed by URL because the source table is deduped by URL too, and the CPU
+ // profile callFrames only expose the script URL (not the isolate), which is
+ // what would be needed to disambiguate scriptIds across isolates.
+ const sourceMapURLByScriptURL = new Map();
+ for (const event of (eventsByName.get('ScriptCatchup') ??
+ []) as ScriptCatchupEvent[]) {
+ const { data } = event.args;
+ if (data.url && data.sourceMapUrl) {
+ sourceMapURLByScriptURL.set(data.url, data.sourceMapUrl);
+ }
+ }
+
const threadInfoByPidAndTid = new Map();
const threadInfoByThread = new Map();
for (const profileEvent of profileEvents) {
@@ -531,7 +581,7 @@ async function processTracingEvents(
profile,
profileEvent
);
- const { thread, nodeIdToStackId } = threadInfo;
+ const { samples: samplesTable, nodeIdToStackId } = threadInfo;
let profileChunks: any[] = [];
if (profileEvent.name === 'Profile') {
@@ -565,8 +615,6 @@ async function processTracingEvents(
continue;
}
- const { samples: samplesTable } = thread;
-
if (nodes) {
const parentMap = new Map();
for (const node of nodes) {
@@ -617,7 +665,15 @@ async function processTracingEvents(
functionName !== '' ? functionName : '(anonymous)'
);
const source =
- isJS && url ? globalDataCollector.indexForSource(null, url) : null;
+ isJS && url
+ ? globalDataCollector.indexForSource(
+ null,
+ url,
+ 1,
+ 1,
+ sourceMapURLByScriptURL.get(url) ?? null
+ )
+ : null;
const resource = isJS
? globalDataCollector.indexForURIResource(url || '')
: -1;
@@ -785,6 +841,10 @@ async function processTracingEvents(
const { shared } = globalDataCollector.finish();
profile.shared = shared;
+ for (const [thread, threadInfo] of threadInfoByThread) {
+ thread.samples = finishRawSamplesTableBuilder(threadInfo.samples);
+ }
+
return profile;
}
@@ -800,7 +860,7 @@ async function extractScreenshots(
// No screenshots were found, exit early.
return;
}
- const { thread } = getThreadInfo(
+ const { markers } = getThreadInfo(
threadInfoByPidAndTid,
threadInfoByThread,
eventsByName,
@@ -825,21 +885,19 @@ async function extractScreenshots(
// The image could not be processed, do not add it.
continue;
}
- thread.markers.data.push({
+ markers.data.push({
type: 'CompositorScreenshot',
url: stringTable.indexForString(urlString),
windowID: 'id',
windowWidth: size.width,
windowHeight: size.height,
});
- thread.markers.name.push(
- stringTable.indexForString('CompositorScreenshot')
- );
- thread.markers.startTime.push(screenshot.ts / 1000);
- thread.markers.endTime.push(null);
- thread.markers.phase.push(INSTANT);
- thread.markers.category.push(graphicsIndex);
- thread.markers.length++;
+ markers.name.push(stringTable.indexForString('CompositorScreenshot'));
+ markers.startTime.push(screenshot.ts / 1000);
+ markers.endTime.push(null);
+ markers.phase.push(INSTANT);
+ markers.category.push(graphicsIndex);
+ markers.length++;
}
}
@@ -991,8 +1049,7 @@ function extractMarkers(
profile,
event
);
- const { thread } = threadInfo;
- const { markers } = thread;
+ const { markers } = threadInfo;
let argData:
| (object & { type2?: unknown; category2?: unknown; detail?: string })
| null = null;
diff --git a/src/profile-logic/import/dhat.ts b/src/profile-logic/import/dhat.ts
index 6f883c2e29..e0dd3f240c 100644
--- a/src/profile-logic/import/dhat.ts
+++ b/src/profile-logic/import/dhat.ts
@@ -10,9 +10,10 @@ import type {
} from 'firefox-profiler/types';
import {
+ finishRawUnbalancedNativeAllocationsTableBuilder,
getEmptyProfile,
getEmptyThread,
- getEmptyUnbalancedNativeAllocationsTable,
+ getEmptyRawUnbalancedNativeAllocationsTable,
} from 'firefox-profiler/profile-logic/data-structures';
import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector';
@@ -154,7 +155,7 @@ type WriteCount = number;
/**
* The dhat convertor converts to the processed profile format, rather than to the Gecko
- * format, as it needs the UnbalancedNativeAllocationsTable type, which is unavailable
+ * format, as it needs the RawUnbalancedNativeAllocationsTable type, which is unavailable
* in the Gecko format. In the Gecko format, that data comes in the form of markers, which
* would be awkard to target.
*/
@@ -187,7 +188,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null {
const frameTable = globalDataCollector.getFrameTable();
const stringTable = globalDataCollector.getStringTable();
- const allocationsTable = getEmptyUnbalancedNativeAllocationsTable();
+ const allocationsTable = getEmptyRawUnbalancedNativeAllocationsTable();
// dhat profiles do no support categories. Fill the category and subcategory information
// with 0s.
@@ -372,13 +373,15 @@ export function attemptToConvertDhat(json: unknown): Profile | null {
thread.tid = i;
thread.name = name;
- thread.nativeAllocations = {
- time: allocationsTable.time.slice(),
- stack: allocationsTable.stack.slice(),
- weight,
- weightType: 'bytes',
- length: allocationsTable.length,
- };
+ thread.nativeAllocations = finishRawUnbalancedNativeAllocationsTableBuilder(
+ {
+ time: allocationsTable.time.slice(),
+ stack: allocationsTable.stack.slice(),
+ weight,
+ weightType: 'bytes',
+ length: allocationsTable.length,
+ }
+ );
return thread;
});
diff --git a/src/profile-logic/import/flame-graph.ts b/src/profile-logic/import/flame-graph.ts
index b468d4d008..6a7e4a1fff 100644
--- a/src/profile-logic/import/flame-graph.ts
+++ b/src/profile-logic/import/flame-graph.ts
@@ -11,8 +11,10 @@ import type {
Profile,
} from 'firefox-profiler/types/profile';
import {
+ finishRawSamplesTableBuilder,
getEmptyProfile,
getEmptyThread,
+ getRawSamplesTableBuilderWithEventDelay,
} from 'firefox-profiler/profile-logic/data-structures';
import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector';
import { ensureExists } from 'firefox-profiler/utils/types';
@@ -61,7 +63,7 @@ export function convertFlameGraphProfile(profileText: string): Profile {
const frameTable = globalDataCollector.getFrameTable();
const stackTable = globalDataCollector.getStackTableBuilder();
- const { samples } = thread;
+ const samples = getRawSamplesTableBuilderWithEventDelay();
// Maps to deduplicate stacks, frames, and functions.
const stackMap = new Map();
@@ -170,6 +172,7 @@ export function convertFlameGraphProfile(profileText: string): Profile {
}
// Finalize the profile.
+ thread.samples = finishRawSamplesTableBuilder(samples);
profile.threads.push(thread);
const { shared } = globalDataCollector.finish();
profile.shared = shared;
diff --git a/src/profile-logic/import/simpleperf.ts b/src/profile-logic/import/simpleperf.ts
index 83c38d8929..75fce1f0d9 100644
--- a/src/profile-logic/import/simpleperf.ts
+++ b/src/profile-logic/import/simpleperf.ts
@@ -5,7 +5,7 @@ import type { Milliseconds } from 'firefox-profiler/types/units';
import type {
CategoryList,
CategoryColor,
- FrameTable,
+ RawFrameTable,
FuncTable,
IndexIntoCategoryList,
IndexIntoFrameTable,
@@ -14,7 +14,6 @@ import type {
IndexIntoStackTable,
ProfileMeta,
ResourceTable,
- RawSamplesTable,
Profile,
RawProfileSharedData,
RawThread,
@@ -23,11 +22,15 @@ import type {
import {
getEmptyFuncTable,
getEmptyResourceTable,
- getEmptyFrameTable,
+ getRawFrameTableBuilder,
getRawStackTableBuilder,
+ finishRawFrameTableBuilder,
+ finishRawSamplesTableBuilder,
finishRawStackTableBuilder,
+ type RawFrameTableBuilder,
type RawStackTableBuilder,
- getEmptySamplesTable,
+ getRawSamplesTableBuilder,
+ type RawSamplesTableBuilder,
getEmptyRawMarkerTable,
getEmptyNativeSymbolTable,
getEmptySourceTable,
@@ -150,15 +153,15 @@ class FirefoxFuncTable {
class FirefoxFrameTable {
strings: StringTable;
- frameTable: FrameTable = getEmptyFrameTable();
+ frameTable: RawFrameTableBuilder = getRawFrameTableBuilder();
frameMap: Map = new Map();
constructor(strings: StringTable) {
this.strings = strings;
}
- toJson(): FrameTable {
- return this.frameTable;
+ toJson(): RawFrameTable {
+ return finishRawFrameTableBuilder(this.frameTable);
}
findOrAddFrame(
@@ -252,7 +255,7 @@ class FirefoxThread {
strings: StringTable;
- sampleTable: RawSamplesTable = getEmptySamplesTable();
+ sampleTable: RawSamplesTableBuilder = getRawSamplesTableBuilder();
stackTable: FirefoxSampleTable;
frameTable: FirefoxFrameTable;
@@ -287,7 +290,7 @@ class FirefoxThread {
isMainThread: this.isMainThread,
pid: this.pid.toString(),
tid: this.tid,
- samples: this.sampleTable,
+ samples: finishRawSamplesTableBuilder(this.sampleTable),
markers: getEmptyRawMarkerTable(),
};
}
diff --git a/src/profile-logic/insert-stack-labels.ts b/src/profile-logic/insert-stack-labels.ts
index 5d281bf46a..e614569e82 100644
--- a/src/profile-logic/insert-stack-labels.ts
+++ b/src/profile-logic/insert-stack-labels.ts
@@ -10,7 +10,8 @@ import type {
Category,
} from '../types/profile';
import {
- shallowCloneFrameTable,
+ finishRawFrameTableBuilder,
+ getRawFrameTableBuilderWithExistingContents,
shallowCloneFuncTable,
} from 'firefox-profiler/profile-logic/data-structures';
import { StringTable } from 'firefox-profiler/utils/string-table';
@@ -105,7 +106,7 @@ export function insertStackLabels(
sources,
stringArray,
} = profile.shared;
- const frameTable = shallowCloneFrameTable(oldFrameTable);
+ const frameTable = getRawFrameTableBuilderWithExistingContents(oldFrameTable);
const funcTable = shallowCloneFuncTable(oldFuncTable);
const stringTable = StringTable.withBackingArray(stringArray);
@@ -274,7 +275,12 @@ export function insertStackLabels(
length: newStackCount,
};
- const newShared = { ...profile.shared, stackTable, frameTable, funcTable };
+ const newShared = {
+ ...profile.shared,
+ stackTable,
+ frameTable: finishRawFrameTableBuilder(frameTable),
+ funcTable,
+ };
const newThreads = updateRawThreadStacks(profile.threads, (oldStack) =>
oldStack !== null ? oldStackToNewStackPlusOne[oldStack] - 1 : null
);
diff --git a/src/profile-logic/js-tracer.ts b/src/profile-logic/js-tracer.ts
index e4664aee95..92ef451f82 100644
--- a/src/profile-logic/js-tracer.ts
+++ b/src/profile-logic/js-tracer.ts
@@ -2,10 +2,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import {
- getEmptySamplesTableWithEventDelay,
+ getRawSamplesTableBuilderWithEventDelay,
getEmptyRawMarkerTable,
+ finishRawFrameTableBuilder,
+ finishRawSamplesTableBuilder,
finishRawStackTableBuilder,
getRawStackTableBuilderWithExistingContents,
+ getRawFrameTableBuilderWithExistingContents,
+ type RawSamplesTableBuilder,
} from './data-structures';
import { StringTable } from '../utils/string-table';
import { ensureExists } from '../utils/types';
@@ -501,8 +505,8 @@ export function convertJsTracerToThreadWithoutSamples(
thread: RawThread;
stackMap: Map;
} {
- const samples: RawSamplesTable = {
- ...getEmptySamplesTableWithEventDelay(),
+ const samples: RawSamplesTableBuilder = {
+ ...getRawSamplesTableBuilderWithEventDelay(),
weight: [],
weightType: 'tracing-ms',
};
@@ -514,7 +518,10 @@ export function convertJsTracerToThreadWithoutSamples(
samples,
};
- const { funcTable, frameTable } = shared;
+ const { funcTable } = shared;
+ const frameTable = getRawFrameTableBuilderWithExistingContents(
+ shared.frameTable
+ );
const stackTable = getRawStackTableBuilderWithExistingContents(
shared.stackTable
);
@@ -625,8 +632,10 @@ export function convertJsTracerToThreadWithoutSamples(
unmatchedEventEnds[unmatchedIndex] = end;
}
- // Write the augmented stackTable back to the shared data.
+ // Write the augmented stackTable and frameTable back to the shared data.
shared.stackTable = finishRawStackTableBuilder(stackTable);
+ shared.frameTable = finishRawFrameTableBuilder(frameTable);
+ thread.samples = finishRawSamplesTableBuilder(samples);
return { thread, stackMap };
}
@@ -798,7 +807,7 @@ export function getSelfTimeSamplesFromJsTracer(
const isNearlyEqual = (a: number, b: number) => Math.abs(a - b) < epsilon;
// Each event type will have it's own timing information, later collapse these into
// a single array.
- const samples = getEmptySamplesTableWithEventDelay();
+ const samples = getRawSamplesTableBuilderWithEventDelay();
const sampleWeights: number[] = [];
samples.weight = sampleWeights;
@@ -1003,5 +1012,5 @@ export function getSelfTimeSamplesFromJsTracer(
);
}
- return samples;
+ return finishRawSamplesTableBuilder(samples);
}
diff --git a/src/profile-logic/marker-data.ts b/src/profile-logic/marker-data.ts
index 147d70426e..6861df3d86 100644
--- a/src/profile-logic/marker-data.ts
+++ b/src/profile-logic/marker-data.ts
@@ -4,6 +4,7 @@
import {
getDefaultCategories,
getEmptyRawMarkerTable,
+ type RawMarkerTableBuilder,
} from './data-structures';
import { getFriendlyThreadName, getTimeRangeForThread } from './profile-data';
import {
@@ -1187,7 +1188,7 @@ export function filterRawMarkerTableToRangeWithMarkersToDelete(
markersToDelete: Set,
filterRange: StartEndRange | null
): {
- rawMarkerTable: RawMarkerTable;
+ rawMarkerTable: RawMarkerTableBuilder;
oldMarkerIndexToNew: Map;
} {
const newMarkerTable = getEmptyRawMarkerTable();
diff --git a/src/profile-logic/marker-schema.ts b/src/profile-logic/marker-schema.ts
index 014452278a..f71db57577 100644
--- a/src/profile-logic/marker-schema.ts
+++ b/src/profile-logic/marker-schema.ts
@@ -12,6 +12,7 @@ import {
formatTimestamp,
formatMicroseconds,
formatNanoseconds,
+ formatHexadecimal,
} from '../utils/format-numbers';
import { ensureExists } from '../utils/types';
import type {
@@ -587,6 +588,8 @@ export function formatFromMarkerSchema(
return formatNumber(value, 0, 0);
case 'decimal':
return formatNumber(value);
+ case 'hexadecimal':
+ return formatHexadecimal(value);
case 'percentage':
return formatPercent(value);
case 'pid':
diff --git a/src/profile-logic/merge-compare.ts b/src/profile-logic/merge-compare.ts
index 3e6f600dcf..10e6a3fd14 100644
--- a/src/profile-logic/merge-compare.ts
+++ b/src/profile-logic/merge-compare.ts
@@ -11,14 +11,17 @@ import {
getEmptyProfile,
getEmptyResourceTable,
getEmptyNativeSymbolTable,
- getEmptyFrameTable,
+ finishRawFrameTableBuilder,
+ finishRawSamplesTableBuilder,
+ getRawFrameTableBuilder,
getEmptyFuncTable,
getRawStackTableBuilder,
finishRawStackTableBuilder,
getEmptyRawMarkerTable,
- getEmptySamplesTableWithEventDelay,
- shallowCloneRawMarkerTable,
+ getRawSamplesTableBuilderWithEventDelay,
+ getRawMarkerTableBuilderFromExisting,
getEmptySourceTable,
+ type RawMarkerTableBuilder,
} from './data-structures';
import {
filterRawThreadSamplesToRange,
@@ -51,7 +54,7 @@ import type {
IndexIntoSourceTable,
IndexIntoSourceLocationTable,
FuncTable,
- FrameTable,
+ RawFrameTable,
Lib,
NativeSymbolTable,
ResourceTable,
@@ -1057,9 +1060,9 @@ function mergeFrameTables(
translationMapsForNativeSymbols: TranslationMapForNativeSymbols[],
translationMapsForOriginalLocation: TranslationMapForOriginalLocation[],
translationMapsForCategories: TranslationMapForCategories[]
-): { frameTable: FrameTable; translationMaps: TranslationMapForFrames[] } {
+): { frameTable: RawFrameTable; translationMaps: TranslationMapForFrames[] } {
const translationMaps: TranslationMapForFrames[] = [];
- const newFrameTable = getEmptyFrameTable();
+ const newFrameTable = getRawFrameTableBuilder();
profiles.forEach((profile, profileIndex) => {
const { frameTable } = profile.shared;
@@ -1108,7 +1111,10 @@ function mergeFrameTables(
translationMaps.push(oldFrameToNewFramePlusOne);
});
- return { frameTable: newFrameTable, translationMaps };
+ return {
+ frameTable: finishRawFrameTableBuilder(newFrameTable),
+ translationMaps,
+ };
}
/**
@@ -1172,21 +1178,19 @@ function combineSamplesDiffing(
): RawSamplesTable {
const [
{
- thread: { samples: samples1, tid: tid1 },
+ thread: { samples: samples1 },
weightMultiplier: weightMultiplier1,
},
{
- thread: { samples: samples2, tid: tid2 },
+ thread: { samples: samples2 },
weightMultiplier: weightMultiplier2,
},
] = threadsAndWeightMultipliers;
const newWeight: number[] = [];
- const newThreadId: Tid[] = [];
const newSamples = {
- ...getEmptySamplesTableWithEventDelay(),
+ ...getRawSamplesTableBuilderWithEventDelay(),
weight: newWeight,
- threadId: newThreadId,
};
const samples1Time = computeTimeColumnForRawSamplesTable(samples1);
@@ -1212,7 +1216,6 @@ function combineSamplesDiffing(
// of eventDelay/responsiveness don't mean anything.
newSamples.eventDelay!.push(null);
newSamples.time!.push(samples1Time[i]);
- newThreadId.push(samples1.threadId ? samples1.threadId[i] : tid1);
// TODO (issue #3151): Figure out a way to diff CPU usage numbers.
// We add the first thread with a negative weight, because this is the
// base profile.
@@ -1228,7 +1231,6 @@ function combineSamplesDiffing(
// of eventDelay/responsiveness don't mean anything.
newSamples.eventDelay!.push(null);
newSamples.time!.push(samples2Time[j]);
- newThreadId.push(samples2.threadId ? samples2.threadId[j] : tid2);
const sampleWeight = samples2.weight ? samples2.weight[j] : 1;
newWeight.push(weightMultiplier2 * sampleWeight);
@@ -1237,7 +1239,7 @@ function combineSamplesDiffing(
}
}
- return newSamples;
+ return finishRawSamplesTableBuilder(newSamples);
}
type ThreadAndWeightMultiplier = {
@@ -1352,21 +1354,16 @@ function combineSamplesForMerging(threads: RawThread[]): RawSamplesTable {
const samplesPerThread: RawSamplesTable[] = threads.map(
(thread) => thread.samples
);
- const sampleTimesPerThread: Milliseconds[][] = samplesPerThread.map(
- computeTimeColumnForRawSamplesTable
- );
+ const sampleTimesPerThread: Float64Array[] =
+ samplesPerThread.map(computeTimeColumnForRawSamplesTable);
// This is the array that holds the latest processed sample index for each
// thread's samplesTable.
const nextSampleIndexPerThread: number[] = Array(
samplesPerThread.length
).fill(0);
- // This array will contain the source thread ids. It will be added to the
- // samples table after the loop.
- const newThreadId: Tid[] = [];
// Creating a new empty samples table to fill.
const newSamples = {
- ...getEmptySamplesTableWithEventDelay(),
- threadId: newThreadId,
+ ...getRawSamplesTableBuilderWithEventDelay(),
};
// If every source thread has threadCPUDelta, and if the threads are
@@ -1433,11 +1430,6 @@ function combineSamplesForMerging(threads: RawThread[]): RawSamplesTable {
// from independent threads instead.
ensureExists(newSamples.eventDelay).push(null);
newSamples.time!.push(sourceThreadSamplesTimeCol[sourceThreadSampleIndex]);
- newThreadId.push(
- sourceThreadSamples.threadId
- ? sourceThreadSamples.threadId[sourceThreadSampleIndex]
- : threads[sourceThreadIndex].tid
- );
if (newThreadCPUDelta !== undefined) {
newThreadCPUDelta.push(
ensureExists(sourceThreadSamples.threadCPUDelta)[
@@ -1451,9 +1443,12 @@ function combineSamplesForMerging(threads: RawThread[]): RawSamplesTable {
}
if (newThreadCPUDelta !== undefined) {
- return { ...newSamples, threadCPUDelta: newThreadCPUDelta };
+ return finishRawSamplesTableBuilder({
+ ...newSamples,
+ threadCPUDelta: newThreadCPUDelta,
+ });
}
- return newSamples;
+ return finishRawSamplesTableBuilder(newSamples);
}
/**
@@ -1461,7 +1456,7 @@ function combineSamplesForMerging(threads: RawThread[]): RawSamplesTable {
*/
function mergeMarkers(threads: RawThread[]): RawMarkerTable {
const newThreadId: Array = [];
- const newMarkerTable: RawMarkerTable = {
+ const newMarkerTable: RawMarkerTableBuilder = {
...getEmptyRawMarkerTable(),
threadId: newThreadId,
};
@@ -1496,7 +1491,9 @@ function getThreadMarkersAndScreenshotMarkers(
threads: RawThread[],
targetThread: RawThread
): RawMarkerTable {
- const targetMarkerTable = shallowCloneRawMarkerTable(targetThread.markers);
+ const targetMarkerTable = getRawMarkerTableBuilderFromExisting(
+ targetThread.markers
+ );
// Find screenshot markers in the other threads and add them to the target thread.
for (const thread of threads) {
diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts
index 2f38fcb4a8..69c4712e7a 100644
--- a/src/profile-logic/process-profile.ts
+++ b/src/profile-logic/process-profile.ts
@@ -12,10 +12,16 @@ import { attemptToConvertDhat } from './import/dhat';
import { GlobalDataCollector } from './global-data-collector';
import { AddressLocator } from './address-locator';
import {
+ finishRawBalancedNativeAllocationsTableBuilder,
+ finishRawJsAllocationsTableBuilder,
+ finishRawUnbalancedNativeAllocationsTableBuilder,
getEmptyExtensions,
getEmptyRawMarkerTable,
- getEmptyJsAllocationsTable,
- getEmptyUnbalancedNativeAllocationsTable,
+ getEmptyRawJsAllocationsTable,
+ getEmptyRawUnbalancedNativeAllocationsTable,
+ getRawMarkerTableBuilderFromExisting,
+ type RawFrameTableBuilder,
+ type RawMarkerTableBuilder,
type RawStackTableBuilder,
} from './data-structures';
import { immutableUpdate, ensureExists } from '../utils/types';
@@ -43,6 +49,12 @@ import {
getFriendlyThreadName,
nudgeReturnAddresses,
} from '../profile-logic/profile-data';
+import {
+ toInt32Array,
+ toUint8Array,
+ toFloat64Array,
+ toFloat64ArraySetNullToZero,
+} from '../utils/typed-arrays';
import { computeStringIndexMarkerFieldsByDataType } from '../profile-logic/marker-schema';
import { convertJsTracerToThread } from '../profile-logic/js-tracer';
@@ -52,7 +64,6 @@ import type {
RawThread,
RawCounter,
ExtensionTable,
- FrameTable,
RawCounterSamplesTable,
RawSamplesTable,
RawMarkerTable,
@@ -61,9 +72,9 @@ import type {
IndexIntoFuncTable,
IndexIntoStringTable,
JsTracerTable,
- JsAllocationsTable,
+ RawJsAllocationsTable,
ProfilerOverhead,
- NativeAllocationsTable,
+ RawNativeAllocationsTable,
Milliseconds,
Microseconds,
Address,
@@ -106,6 +117,7 @@ import type {
IndexIntoCategoryList,
IndexIntoFrameTable,
CounterDisplayConfig,
+ RawProfileSharedData,
} from 'firefox-profiler/types';
import { decompress, isGzip } from 'firefox-profiler/utils/gz';
import { jsonEncodeObjectWithTypedArraysAsRegularArrays } from 'firefox-profiler/utils/json-with-typed-arrays';
@@ -521,7 +533,7 @@ function _extractUnknownFunctionType(
*/
function _processFrameTable(
geckoFrameStruct: GeckoFrameStruct,
- sharedFrameTable: FrameTable,
+ sharedFrameTable: RawFrameTableBuilder,
frameFuncs: IndexIntoFuncTable[],
frameAddresses: (Address | null)[]
): IndexIntoFrameTable {
@@ -631,8 +643,8 @@ function _convertPayloadStackToIndex(
* Process the markers.
* Convert stacks to causes.
* Process GC markers.
- * Extract JS allocations into the JsAllocationsTable.
- * Extract Native allocations into the NativeAllocationsTable.
+ * Extract JS allocations into the RawJsAllocationsTable.
+ * Extract Native allocations into the RawNativeAllocationsTable.
*/
function _processMarkers(
geckoMarkers: GeckoMarkerStruct,
@@ -642,13 +654,13 @@ function _processMarkers(
stackIndexOffset: IndexIntoStackTable
): {
markers: RawMarkerTable;
- jsAllocations: JsAllocationsTable | null;
- nativeAllocations: NativeAllocationsTable | null;
+ jsAllocations: RawJsAllocationsTable | null;
+ nativeAllocations: RawNativeAllocationsTable | null;
} {
const markers = getEmptyRawMarkerTable();
- const jsAllocations = getEmptyJsAllocationsTable();
+ const jsAllocations = getEmptyRawJsAllocationsTable();
const inProgressNativeAllocations =
- getEmptyUnbalancedNativeAllocationsTable();
+ getEmptyRawUnbalancedNativeAllocationsTable();
const memoryAddress: number[] = [];
const threadId: number[] = [];
@@ -756,29 +768,24 @@ function _processMarkers(
nativeAllocations = null;
} else if (hasMemoryAddresses) {
// This is the newer native allocations with memory addresses.
- nativeAllocations = {
- time: inProgressNativeAllocations.time,
- weight: inProgressNativeAllocations.weight,
- weightType: inProgressNativeAllocations.weightType,
- stack: inProgressNativeAllocations.stack,
+ nativeAllocations = finishRawBalancedNativeAllocationsTableBuilder({
+ ...inProgressNativeAllocations,
memoryAddress,
threadId,
- length: inProgressNativeAllocations.length,
- };
+ });
} else {
// There is the older native allocations, without memory addresses.
- nativeAllocations = {
- time: inProgressNativeAllocations.time,
- weight: inProgressNativeAllocations.weight,
- weightType: inProgressNativeAllocations.weightType,
- stack: inProgressNativeAllocations.stack,
- length: inProgressNativeAllocations.length,
- };
+ nativeAllocations = finishRawUnbalancedNativeAllocationsTableBuilder(
+ inProgressNativeAllocations
+ );
}
return {
markers: markers,
- jsAllocations: jsAllocations.length === 0 ? null : jsAllocations,
+ jsAllocations:
+ jsAllocations.length === 0
+ ? null
+ : finishRawJsAllocationsTableBuilder(jsAllocations),
nativeAllocations,
};
}
@@ -1471,10 +1478,9 @@ function _processThread(
* has its own timebase, and we don't want to keep converting timestamps when
* we deal with the integrated profile.
*/
-export function adjustTableTimestamps(
- table: Table,
- delta: Milliseconds
-): Table {
+export function adjustTableTimestamps<
+ Table extends { time: Milliseconds[] | Float64Array },
+>(table: Table, delta: Milliseconds): Table {
return {
...table,
time: table.time.map((time) => time + delta),
@@ -1482,7 +1488,7 @@ export function adjustTableTimestamps(
}
export function adjustTableTimeDeltas<
- Table extends { timeDeltas?: Milliseconds[] },
+ Table extends { timeDeltas?: Milliseconds[] | Float64Array },
>(table: Table, delta: Milliseconds): Table {
const { timeDeltas } = table;
if (timeDeltas === undefined) {
@@ -1545,13 +1551,23 @@ export function adjustMarkerTimestamps(
markers: RawMarkerTable,
delta: Milliseconds
): RawMarkerTable {
- function adjustTimeIfNotNull(time: number | null) {
- return time === null ? time : time + delta;
+ function adjustTimes(
+ times: Array | Float64Array
+ ): Array | Float64Array {
+ if (Array.isArray(times)) {
+ return times.map((time) => (time === null ? time : time + delta));
+ }
+ // JSLB Float64Array: no nulls; shift every value.
+ const out = new Float64Array(times.length);
+ for (let i = 0; i < times.length; i++) {
+ out[i] = times[i] + delta;
+ }
+ return out;
}
return {
...markers,
- startTime: markers.startTime.map(adjustTimeIfNotNull),
- endTime: markers.endTime.map(adjustTimeIfNotNull),
+ startTime: adjustTimes(markers.startTime),
+ endTime: adjustTimes(markers.endTime),
data: markers.data.map((data) => {
if (!data) {
return data;
@@ -2061,6 +2077,101 @@ export function serializeProfileToJsonString(profile: Profile): string {
return jsonEncodeObjectWithTypedArraysAsRegularArrays(profile);
}
+/**
+ * Convert all columns of a profile which are eligible to be stored as typed
+ * arrays into typed arrays.
+ *
+ * This is useful if the profile will be saved as a JSLB file:
+ * `serializeProfileToJsonSlabsFile` will be able to store these columns as binary
+ * slabs instead of as JSON arrays, which speeds up both the saving and the loading
+ * of the file.
+ *
+ * Does not mutate the input profile.
+ */
+export function optimizeProfileForStorage(profile: Profile): Profile {
+ return {
+ ...profile,
+ shared: convertSharedTablesEligibleColumns(profile.shared),
+ threads: profile.threads.map(convertThreadEligibleColumns),
+ counters: profile.counters?.map(convertCounterEligibleColumns),
+ };
+}
+
+function convertSharedTablesEligibleColumns(
+ shared: RawProfileSharedData
+): RawProfileSharedData {
+ const { stackTable, frameTable } = shared;
+ return {
+ ...shared,
+ stackTable: {
+ frame: toInt32Array(stackTable.frame),
+ prefixOffset: toInt32Array(stackTable.prefixOffset),
+ length: stackTable.length,
+ },
+ frameTable: {
+ ...frameTable,
+ address: toInt32Array(frameTable.address),
+ inlineDepth: toUint8Array(frameTable.inlineDepth),
+ func: toInt32Array(frameTable.func),
+ },
+ };
+}
+
+function convertThreadEligibleColumns(thread: RawThread): RawThread {
+ const newThread: RawThread = {
+ ...thread,
+ samples: convertSamplesTimesToTypedArrays(thread.samples),
+ markers: convertMarkersEligibleColumnsToTypedArrays(thread.markers),
+ };
+ if (thread.jsAllocations !== undefined) {
+ newThread.jsAllocations = {
+ ...thread.jsAllocations,
+ time: toFloat64Array(thread.jsAllocations.time),
+ };
+ }
+ if (thread.nativeAllocations !== undefined) {
+ newThread.nativeAllocations = {
+ ...thread.nativeAllocations,
+ time: toFloat64Array(thread.nativeAllocations.time),
+ };
+ }
+ return newThread;
+}
+
+function convertSamplesTimesToTypedArrays(
+ samples: RawSamplesTable
+): RawSamplesTable {
+ const result = { ...samples };
+ if (samples.time !== undefined) {
+ result.time = toFloat64Array(samples.time);
+ }
+ if (samples.timeDeltas !== undefined) {
+ result.timeDeltas = toFloat64Array(samples.timeDeltas);
+ }
+ return result;
+}
+
+function convertMarkersEligibleColumnsToTypedArrays(
+ markers: RawMarkerTable
+): RawMarkerTable {
+ return {
+ ...markers,
+ startTime: toFloat64ArraySetNullToZero(markers.startTime),
+ endTime: toFloat64ArraySetNullToZero(markers.endTime),
+ };
+}
+
+function convertCounterEligibleColumns(counter: RawCounter): RawCounter {
+ const samples: RawCounterSamplesTable = { ...counter.samples };
+ if (counter.samples.time !== undefined) {
+ samples.time = toFloat64Array(counter.samples.time);
+ }
+ if (counter.samples.timeDeltas !== undefined) {
+ samples.timeDeltas = toFloat64Array(counter.samples.timeDeltas);
+ }
+ return { ...counter, samples };
+}
+
/**
* Take a profile and convert it to a Uint8Array in the JsonSlabs format.
*
@@ -2369,8 +2480,17 @@ export function processVisualMetrics(
(cat) => cat.name === 'Test'
);
+ const mainThreadMarkers = getRawMarkerTableBuilderFromExisting(
+ mainThread.markers
+ );
+ mainThread.markers = mainThreadMarkers;
+ const tabThreadMarkers = getRawMarkerTableBuilderFromExisting(
+ tabThread.markers
+ );
+ tabThread.markers = tabThreadMarkers;
+
function maybeAddMetricMarker(
- thread: RawThread,
+ markers: RawMarkerTableBuilder,
name: string,
phase: MarkerPhase,
startTime: number | null,
@@ -2388,14 +2508,13 @@ export function processVisualMetrics(
// browsertime bug here: https://github.com/sitespeedio/browsertime/issues/1746.
return;
}
- // Add the marker to the given thread.
- thread.markers.name.push(stringTable.indexForString(name));
- thread.markers.startTime.push(startTime);
- thread.markers.endTime.push(endTime);
- thread.markers.phase.push(phase);
- thread.markers.category.push(testingCategoryIdx);
- thread.markers.data.push(payload ?? null);
- thread.markers.length++;
+ markers.name.push(stringTable.indexForString(name));
+ markers.startTime.push(startTime);
+ markers.endTime.push(endTime);
+ markers.phase.push(phase);
+ markers.category.push(testingCategoryIdx);
+ markers.data.push(payload ?? null);
+ markers.length++;
}
// Find the navigation start time in the tab thread for specifying the marker
@@ -2426,9 +2545,21 @@ export function processVisualMetrics(
// Add the progress marker to the parent process main thread.
const markerName = `${metricName} Progress`;
- maybeAddMetricMarker(mainThread, markerName, INTERVAL, startTime, endTime);
+ maybeAddMetricMarker(
+ mainThreadMarkers,
+ markerName,
+ INTERVAL,
+ startTime,
+ endTime
+ );
// Add the progress marker to the tab process main thread.
- maybeAddMetricMarker(tabThread, markerName, INTERVAL, startTime, endTime);
+ maybeAddMetricMarker(
+ tabThreadMarkers,
+ markerName,
+ INTERVAL,
+ startTime,
+ endTime
+ );
// Add progress markers for every visual progress change for more fine grained information.
const progressMarkerSchema: MarkerSchema = {
@@ -2451,7 +2582,7 @@ export function processVisualMetrics(
// Add it to the parent process main thread.
maybeAddMetricMarker(
- mainThread,
+ mainThreadMarkers,
changeMarkerName,
INSTANT,
timestamp,
@@ -2460,7 +2591,7 @@ export function processVisualMetrics(
);
// Add it to the tab process main thread.
maybeAddMetricMarker(
- tabThread,
+ tabThreadMarkers,
changeMarkerName,
INSTANT,
timestamp,
diff --git a/src/profile-logic/processed-profile-versioning.ts b/src/profile-logic/processed-profile-versioning.ts
index 059fde27e1..1e690b4233 100644
--- a/src/profile-logic/processed-profile-versioning.ts
+++ b/src/profile-logic/processed-profile-versioning.ts
@@ -3276,6 +3276,27 @@ const _upgraders: {
stackTable.prefixOffset = prefixOffset;
delete stackTable.prefix;
},
+ [67]: (_profile: any) => {
+ // Various raw columns can now optionally be stored as typed arrays:
+ // - `thread.samples.time` / `timeDeltas` (`Float64Array`)
+ // - `counter.samples.time` / `timeDeltas` (`Float64Array`)
+ // - `thread.jsAllocations.time` (`Float64Array`)
+ // - `thread.nativeAllocations.time` (`Float64Array`)
+ // - `profile.shared.frameTable.func` (`Int32Array`)
+ // - `profile.shared.frameTable.address` (`Int32Array`, `-1` sentinel)
+ // - `profile.shared.frameTable.inlineDepth` (`Uint8Array`)
+ // Regular JS / JSON arrays are still accepted. All valid v66 profiles
+ // are valid v67 profiles, so no upgrader is needed.
+ },
+ [68]: (_profile: any) => {
+ // The `startTime` and `endTime` columns of the raw marker table
+ // (`thread.markers`) can now optionally be stored as `Float64Array`.
+ // Each marker's `phase` determines which of the two is meaningful, so
+ // slots that would otherwise be `null` may carry a placeholder value
+ // (typically `0`); those slots are never read. Regular JS / JSON arrays
+ // are still accepted. All valid v67 profiles are valid v68 profiles, so
+ // no upgrader is needed.
+ },
// If you add a new upgrader here, please document the change in
// `docs-developer/CHANGELOG-formats.md`.
};
diff --git a/src/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts
index 3704452a0c..9adb8404a7 100644
--- a/src/profile-logic/profile-compacting.ts
+++ b/src/profile-logic/profile-compacting.ts
@@ -12,7 +12,7 @@ import type {
RawMarkerTable,
IndexIntoStackTable,
RawStackTable,
- FrameTable,
+ RawFrameTable,
FuncTable,
ResourceTable,
NativeSymbolTable,
@@ -61,7 +61,10 @@ type ColumnDescription = null extends (
| { type: 'NO_REF' };
type TableDescription = {
- [K in keyof T as T[K] extends Array | Int32Array
+ [K in keyof T as T[K] extends
+ | Array
+ | Int32Array
+ | Uint8Array
? K
: never]: ColumnDescription;
};
@@ -159,12 +162,12 @@ export function computeCompactedProfile(
frame: ColDesc.indexRefInt32(tcs.frameTable),
prefixOffset: ColDesc.selfPrefixOffset(),
};
- const frameTableDesc: TableDescription = {
+ const frameTableDesc: TableDescription = {
address: ColDesc.noRef(),
inlineDepth: ColDesc.noRef(),
category: ColDesc.noRef(),
subcategory: ColDesc.noRef(),
- func: ColDesc.indexRef(tcs.funcTable),
+ func: ColDesc.indexRefInt32(tcs.funcTable),
nativeSymbol: ColDesc.indexRefOrNull(tcs.nativeSymbols),
innerWindowID: ColDesc.noRef(),
line: ColDesc.noRef(),
diff --git a/src/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts
index d55997a537..fd210b62ca 100644
--- a/src/profile-logic/profile-data.ts
+++ b/src/profile-logic/profile-data.ts
@@ -7,9 +7,10 @@ import MixedTupleMap from 'mixedtuplemap';
import { oneLine } from 'common-tags';
import {
getRawStackTableBuilder,
+ finishRawFrameTableBuilder,
finishRawStackTableBuilder,
getEmptyCallNodeTable,
- shallowCloneFrameTable,
+ getRawFrameTableBuilderWithExistingContents,
shallowCloneFuncTable,
} from './data-structures';
import {
@@ -54,6 +55,7 @@ import type {
RawStackTable,
SampleUnits,
StackTable,
+ RawFrameTable,
FrameTable,
FuncTable,
NativeSymbolTable,
@@ -73,6 +75,9 @@ import type {
CounterIndex,
RawCounterSamplesTable,
CounterSamplesTable,
+ RawJsAllocationsTable,
+ JsAllocationsTable,
+ RawNativeAllocationsTable,
NativeAllocationsTable,
InnerWindowID,
BalancedNativeAllocationsTable,
@@ -106,6 +111,11 @@ import type {
} from 'firefox-profiler/types';
import { SelectedState, ResourceType } from 'firefox-profiler/types';
import type { CallNodeInfo, SuffixOrderIndex } from './call-node-info';
+import {
+ toFloat64Array,
+ toInt32Array,
+ toUint8Array,
+} from 'firefox-profiler/utils/typed-arrays';
/**
* Various helpers for dealing with the profile as a data structure.
@@ -1936,9 +1946,12 @@ function _computeStackMatchesFromFuncMatches(
export function computeTimeColumnForRawSamplesTable(
samples: RawSamplesTable | RawCounterSamplesTable
-): number[] {
+): Float64Array {
const { time, timeDeltas } = samples;
- return time ?? numberSeriesFromDeltas(ensureExists(timeDeltas));
+ if (time !== undefined) {
+ return toFloat64Array(time);
+ }
+ return numberSeriesFromDeltas(ensureExists(timeDeltas));
}
export function computeSampleCategoriesAndSubcategories(
@@ -2011,7 +2024,10 @@ export function hasUsefulSamples(
* This function takes both a SamplesTable and can be used on CounterSamplesTable.
*/
export function getSampleIndexRangeForSelection(
- times: { time: Milliseconds[]; length: number },
+ times: {
+ time: Milliseconds[] | Float64Array;
+ length: number;
+ },
rangeStart: number,
rangeEnd: number
): [IndexIntoSamplesTable, IndexIntoSamplesTable] {
@@ -2019,7 +2035,7 @@ export function getSampleIndexRangeForSelection(
}
export function getIndexRangeForSelection(
- times: Milliseconds[],
+ times: Milliseconds[] | Float64Array,
rangeStart: number,
rangeEnd: number
): [IndexIntoSamplesTable, IndexIntoSamplesTable] {
@@ -2034,7 +2050,10 @@ export function getIndexRangeForSelection(
* sure that some charts will not be cut off at the edges when zoomed in to a range.
*/
export function getInclusiveSampleIndexRangeForSelection(
- table: { time: Milliseconds[]; length: number },
+ table: {
+ time: Milliseconds[] | Float64Array;
+ length: number;
+ },
rangeStart: number,
rangeEnd: number
): [IndexIntoSamplesTable, IndexIntoSamplesTable] {
@@ -2042,7 +2061,7 @@ export function getInclusiveSampleIndexRangeForSelection(
}
export function getInclusiveIndexRangeForSelection(
- times: Milliseconds[],
+ times: Milliseconds[] | Float64Array,
rangeStart: number,
rangeEnd: number
): [IndexIntoSamplesTable, IndexIntoSamplesTable] {
@@ -2155,13 +2174,6 @@ export function filterThreadSamplesToRange(
);
}
- if (samples.threadId) {
- newSamples.threadId = samples.threadId.slice(
- beginSampleIndex,
- endSampleIndex
- );
- }
-
const newThread: Thread = {
...thread,
samples: newSamples,
@@ -2288,13 +2300,6 @@ export function filterRawThreadSamplesToRange(
);
}
- if (samples.threadId) {
- newSamples.threadId = samples.threadId.slice(
- beginSampleIndex,
- endSampleIndex
- );
- }
-
const newThread: RawThread = {
...thread,
samples: newSamples,
@@ -2726,7 +2731,6 @@ export function computeSamplesTableFromRawSamplesTable(
threadCPUDelta,
weight,
weightType,
- threadId,
length,
} = rawSamples;
@@ -2763,7 +2767,6 @@ export function computeSamplesTableFromRawSamplesTable(
stack,
weight,
weightType,
- threadId,
length,
// These fields are derived:
@@ -2775,6 +2778,48 @@ export function computeSamplesTableFromRawSamplesTable(
};
}
+export function computeJsAllocationsTableFromRawJsAllocationsTable(
+ raw: RawJsAllocationsTable
+): JsAllocationsTable {
+ return {
+ time: toFloat64Array(raw.time),
+ className: raw.className,
+ typeName: raw.typeName,
+ coarseType: raw.coarseType,
+ weight: raw.weight,
+ weightType: raw.weightType,
+ inNursery: raw.inNursery,
+ stack: raw.stack,
+ length: raw.length,
+ };
+}
+
+export function computeNativeAllocationsTableFromRawNativeAllocationsTable(
+ raw: RawNativeAllocationsTable
+): NativeAllocationsTable {
+ const time = toFloat64Array(raw.time);
+ if ('memoryAddress' in raw) {
+ return {
+ time,
+ weight: raw.weight,
+ weightType: raw.weightType,
+ stack: raw.stack,
+ argumentValues: raw.argumentValues,
+ memoryAddress: raw.memoryAddress,
+ threadId: raw.threadId,
+ length: raw.length,
+ };
+ }
+ return {
+ time,
+ weight: raw.weight,
+ weightType: raw.weightType,
+ stack: raw.stack,
+ argumentValues: raw.argumentValues,
+ length: raw.length,
+ };
+}
+
/**
* Create the derived Thread.
*/
@@ -2789,7 +2834,9 @@ export function createThreadFromDerivedTables(
stringTable: StringTable,
sources: SourceTable,
tracedValuesBuffer: ArrayBuffer | undefined,
- sourceLocationTable: SourceLocationTable
+ sourceLocationTable: SourceLocationTable,
+ jsAllocations: JsAllocationsTable | undefined,
+ nativeAllocations: NativeAllocationsTable | undefined
): Thread {
const {
processType,
@@ -2806,8 +2853,6 @@ export function createThreadFromDerivedTables(
isJsTracer,
pid,
tid,
- jsAllocations,
- nativeAllocations,
markers,
jsTracer,
isPrivateBrowsing,
@@ -2896,11 +2941,11 @@ export function updateThreadStacksByGeneratingNewStackColumns(
newStackTable: StackTable,
computeMappedStackColumn: (
oldStack: Array,
- sampleTime: Array
+ sampleTime: Float64Array
) => Array,
computeMappedSyncBacktraceStackColumn: (
oldStack: Array,
- sampleTime: Array
+ sampleTime: Float64Array
) => Array,
computeMappedMarkerDataColumn: (
markerData: Array
@@ -4309,7 +4354,7 @@ export function nudgeReturnAddresses(profile: Profile): Profile {
// Create the new frame table.
// Frames that were observed both from the instruction pointer and from
// stack walking have to be duplicated.
- const newFrameTable = shallowCloneFrameTable(frameTable);
+ const newFrameTable = getRawFrameTableBuilderWithExistingContents(frameTable);
// Iterate over all *return address* frames, i.e. all frames that were obtained
// by stack walking.
for (const [frame, address] of returnAddressFrames) {
@@ -4392,7 +4437,7 @@ export function nudgeReturnAddresses(profile: Profile): Profile {
const newShared: RawProfileSharedData = {
...profile.shared,
- frameTable: newFrameTable,
+ frameTable: finishRawFrameTableBuilder(newFrameTable),
stackTable: finishRawStackTableBuilder(newStackTable),
};
@@ -4723,6 +4768,27 @@ export function computeTabToThreadIndexesMap(
return tabToThreadIndexesMap;
}
+export function computeFrameTableFromRawFrameTable(
+ rawFrameTable: RawFrameTable
+): FrameTable {
+ const address = toInt32Array(rawFrameTable.address);
+ const inlineDepth = toUint8Array(rawFrameTable.inlineDepth);
+ const func = toInt32Array(rawFrameTable.func);
+ return {
+ address,
+ inlineDepth,
+ category: rawFrameTable.category,
+ subcategory: rawFrameTable.subcategory,
+ func,
+ nativeSymbol: rawFrameTable.nativeSymbol,
+ innerWindowID: rawFrameTable.innerWindowID,
+ line: rawFrameTable.line,
+ column: rawFrameTable.column,
+ originalLocation: rawFrameTable.originalLocation,
+ length: rawFrameTable.length,
+ };
+}
+
export function computeStackTableFromRawStackTable(
rawStackTable: RawStackTable,
frameTable: FrameTable,
@@ -4775,10 +4841,7 @@ export function computeStackTableFromRawStackTable(
}
// The frame column is a typed array in the derived stack table.
- const frame =
- rawStackTable.frame instanceof Int32Array
- ? rawStackTable.frame
- : new Int32Array(rawStackTable.frame);
+ const frame = toInt32Array(rawStackTable.frame);
return {
frame,
diff --git a/src/profile-logic/sanitize.ts b/src/profile-logic/sanitize.ts
index 8a5094296c..3bebefecb7 100644
--- a/src/profile-logic/sanitize.ts
+++ b/src/profile-logic/sanitize.ts
@@ -4,7 +4,7 @@
import {
getEmptyExtensions,
- shallowCloneRawMarkerTable,
+ getRawMarkerTableBuilderFromExisting,
shallowCloneFuncTable,
} from './data-structures';
import { computeCompactedProfile } from './profile-compacting';
@@ -456,7 +456,7 @@ function sanitizeThreadPII(
return null;
}
- let markerTable = shallowCloneRawMarkerTable(thread.markers);
+ let markerTable = getRawMarkerTableBuilderFromExisting(thread.markers);
// We iterate all the markers and remove/change data depending on the PII
// status.
diff --git a/src/profile-logic/source-map-store.ts b/src/profile-logic/source-map-store.ts
index 068719e3d9..1ba9a22ebc 100644
--- a/src/profile-logic/source-map-store.ts
+++ b/src/profile-logic/source-map-store.ts
@@ -25,10 +25,8 @@ export class SourceMapStore {
): Promise {
const consumers = new Map();
- // `initialize` is a static method at runtime but typed as instance method
- // in the .d.ts. https://github.com/mozilla/source-map/pull/520
// No-op if already initialized.
- await (LibSourceMapConsumer as any).initialize({
+ LibSourceMapConsumer.initialize({
'lib/mappings.wasm': wasmUrl,
});
diff --git a/src/profile-logic/source-map-symbolication.ts b/src/profile-logic/source-map-symbolication.ts
index f4d5ebe4c6..2c013c5323 100644
--- a/src/profile-logic/source-map-symbolication.ts
+++ b/src/profile-logic/source-map-symbolication.ts
@@ -67,8 +67,9 @@
*/
import {
+ finishRawFrameTableBuilder,
shallowCloneFuncTable,
- shallowCloneFrameTable,
+ getRawFrameTableBuilderWithExistingContents,
shallowCloneSourceLocationTable,
} from './data-structures';
import { StringTable } from '../utils/string-table';
@@ -92,7 +93,7 @@ import type {
IndexIntoFuncTable,
IndexIntoFrameTable,
FuncTable,
- FrameTable,
+ RawFrameTable,
RawProfileSharedData,
SourceLocationTable,
SourceTable,
@@ -132,7 +133,7 @@ type ParsedSource = {
// main thread in applySourceMapSymbolicationResponse, which builds new
// tables from the current shared state at apply time.
export type SourceMapSymbolicationInput = {
- frameTable: FrameTable;
+ frameTable: RawFrameTable;
funcTable: FuncTable;
sourceLocationTable: SourceLocationTable;
sources: SourceTable;
@@ -185,7 +186,7 @@ export function symbolicateWithSourceMaps(
* candidates for line/column remapping.
*/
function _identifyToSymbolicate(
- frameTable: FrameTable,
+ frameTable: RawFrameTable,
funcTable: FuncTable,
sources: SourceTable
): {
@@ -949,7 +950,7 @@ export function applySourceMapSymbolicationResponse(
response: SourceMapSymbolicationResponse
): {
newFuncTable: FuncTable;
- newFrameTable: FrameTable;
+ newFrameTable: RawFrameTable;
newSourceLocationTable: SourceLocationTable;
newSources: SourceTable;
newStringArray: string[];
@@ -958,7 +959,7 @@ export function applySourceMapSymbolicationResponse(
shared;
const newFuncTable = shallowCloneFuncTable(funcTable);
- const newFrameTable = shallowCloneFrameTable(frameTable);
+ const newFrameTable = getRawFrameTableBuilderWithExistingContents(frameTable);
const newSourceLocationTable =
shallowCloneSourceLocationTable(sourceLocationTable);
const newSources = _shallowCloneSourceTable(sources);
@@ -1042,7 +1043,7 @@ export function applySourceMapSymbolicationResponse(
return {
newFuncTable,
- newFrameTable,
+ newFrameTable: finishRawFrameTableBuilder(newFrameTable),
newSourceLocationTable,
newSources,
newStringArray,
diff --git a/src/profile-logic/symbolication.ts b/src/profile-logic/symbolication.ts
index 52a53d7c1a..a501c112b2 100644
--- a/src/profile-logic/symbolication.ts
+++ b/src/profile-logic/symbolication.ts
@@ -3,10 +3,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import {
getRawStackTableBuilder,
+ finishRawFrameTableBuilder,
finishRawStackTableBuilder,
shallowCloneFuncTable,
shallowCloneNativeSymbolTable,
- shallowCloneFrameTable,
+ getRawFrameTableBuilderWithExistingContents,
} from './data-structures';
import { SymbolsNotFoundError } from './errors';
@@ -716,7 +717,7 @@ function _partiallyApplySymbolicationStep(
// Integrate the new native symbol column into the frame table and make a
// copy so that we can add new frames below.
- const frameTable = shallowCloneFrameTable({
+ const frameTable = getRawFrameTableBuilderWithExistingContents({
...oldFrameTable,
nativeSymbol: newFrameTableNativeSymbolsColumn,
});
@@ -892,7 +893,7 @@ function _partiallyApplySymbolicationStep(
const newShared = {
...shared,
- frameTable,
+ frameTable: finishRawFrameTableBuilder(frameTable),
funcTable,
nativeSymbols,
};
diff --git a/src/profile-logic/tracks.ts b/src/profile-logic/tracks.ts
index 860f8087db..0419d35430 100644
--- a/src/profile-logic/tracks.ts
+++ b/src/profile-logic/tracks.ts
@@ -22,6 +22,7 @@ import type {
import {
getFriendlyThreadName,
computeStackTableFromRawStackTable,
+ computeFrameTableFromRawFrameTable,
} from './profile-data';
import { intersectSets, subtractSets } from '../utils/set';
import { StringTable } from '../utils/string-table';
@@ -1548,7 +1549,7 @@ function _computeThreadSampleScore(
: -1;
const derivedStackTable = computeStackTableFromRawStackTable(
stackTable,
- frameTable,
+ computeFrameTableFromRawFrameTable(frameTable),
meta.categories,
defaultCategory
);
diff --git a/src/profile-logic/transforms.ts b/src/profile-logic/transforms.ts
index 0dd6f2b7ff..57a96ed9d6 100644
--- a/src/profile-logic/transforms.ts
+++ b/src/profile-logic/transforms.ts
@@ -45,7 +45,6 @@ import type {
MarkerIndex,
MarkerSchemaByName,
CategoryList,
- Milliseconds,
ProfileIndexTranslationMaps,
} from 'firefox-profiler/types';
import type { CallNodeInfo } from 'firefox-profiler/profile-logic/call-node-info';
@@ -1876,7 +1875,7 @@ export function filterSamples(
function computeFilteredStackColumn(
originalStackColumn: Array,
- timeColumn: Milliseconds[]
+ timeColumn: Float64Array
): Array {
const newStackColumn = originalStackColumn.slice();
let sampleIndex = 0;
diff --git a/src/profile-query/cpu-activity.ts b/src/profile-query/cpu-activity.ts
index 79351ac47b..d1f6b0666d 100644
--- a/src/profile-query/cpu-activity.ts
+++ b/src/profile-query/cpu-activity.ts
@@ -69,7 +69,7 @@ function collectSliceSubtree(
childrenStartPerParent: Array,
interestingSliceIndexes: Set,
nestingDepth: number,
- time: number[],
+ time: Float64Array,
result: CpuActivityEntry[],
tsManager: TimestampManager
) {
diff --git a/src/profile-query/formatters/counter-info.ts b/src/profile-query/formatters/counter-info.ts
index 57ad58f0bd..9f7ad9924e 100644
--- a/src/profile-query/formatters/counter-info.ts
+++ b/src/profile-query/formatters/counter-info.ts
@@ -4,9 +4,10 @@
import {
getProfile,
- getProfileRootRange,
getCounters,
getCounterSelectors,
+ getCommittedRange,
+ getProfileInterval,
getMeta,
} from 'firefox-profiler/selectors/profile';
import {
@@ -22,22 +23,35 @@ import {
ENERGY_LADDER,
pickTier,
} from 'firefox-profiler/components/timeline/TrackCounterTooltipFormat';
+import { getSampleIndexRangeForSelection } from 'firefox-profiler/profile-logic/profile-data';
+import { ensureExists } from 'firefox-profiler/utils/types';
import { getCounterHandle, parseCounterHandle } from '../counter-map';
+import { getProcessName } from '../process-thread-list';
import type {
CounterIndex,
+ CounterDisplayConfig,
CounterTooltipDataSource,
CounterTooltipFormat,
+ CounterTooltipRow,
ProfileMeta,
} from 'firefox-profiler/types';
import type { Store } from '../../types/store';
import type { ThreadMap } from '../thread-map';
+import type { TimestampManager } from '../timestamps';
import type {
CounterStat,
CounterSummary,
+ CounterTimeBucket,
CounterListResult,
CounterInfoResult,
} from '../types';
+// Number of buckets in the detailed "over time" table.
+const OVER_TIME_BUCKET_COUNT = 10;
+
+// Width (in characters/points) of the higher-resolution sparkline series.
+const GRAPH_BUCKET_COUNT = 50;
+
// The tooltip schema describes many per-sample and preview-selection rows that
// only make sense at a hover point. These are the two sources that aggregate
// over the whole committed range, so they are the only ones a CLI summary can
@@ -172,6 +186,7 @@ function collectCounterStats(
export function collectCounterSummary(
store: Store,
threadMap: ThreadMap,
+ processIndexMap: Map,
counterIndex: CounterIndex
): CounterSummary {
const state = store.getState();
@@ -180,10 +195,19 @@ export function collectCounterSummary(
const counter = selectors.getCounter(state);
const { display } = counter;
- const [rangeStartIndex, rangeEndIndex] =
- selectors.getCommittedRangeCounterSampleRange(state);
+ const [rangeStartIndex, rangeEndIndex] = getInRangeSampleIndexes(
+ store,
+ counterIndex
+ );
- const mainThreadName = profile.threads[counter.mainThreadIndex]?.name ?? '';
+ const mainThread = ensureExists(
+ profile.threads[counter.mainThreadIndex],
+ `Counter ${getCounterHandle(counterIndex)} references thread ${counter.mainThreadIndex}, which does not exist.`
+ );
+ const processIndex = ensureExists(
+ processIndexMap.get(counter.pid),
+ `Counter ${getCounterHandle(counterIndex)} belongs to pid ${counter.pid}, which has no matching process in the profile.`
+ );
return {
counterHandle: getCounterHandle(counterIndex),
@@ -195,11 +219,15 @@ export function collectCounterSummary(
graphType: display.graphType,
color: display.color,
pid: counter.pid,
+ processIndex,
+ processName: getProcessName(mainThread),
+ etld1: mainThread['eTLD+1'],
mainThreadIndex: counter.mainThreadIndex,
mainThreadHandle: threadMap.handleForThreadIndex(counter.mainThreadIndex),
- mainThreadName,
+ mainThreadName: mainThread.name,
rangeSampleCount: Math.max(0, rangeEndIndex - rangeStartIndex),
stats: collectCounterStats(store, counterIndex),
+ graph: collectCounterGraph(store, counterIndex),
};
}
@@ -209,42 +237,312 @@ export function collectCounterSummary(
*/
export function collectCounterList(
store: Store,
- threadMap: ThreadMap
+ threadMap: ThreadMap,
+ processIndexMap: Map
): CounterListResult {
return {
type: 'counter-list',
counters: getSortedCounterIndexes(store).map((index) =>
- collectCounterSummary(store, threadMap, index)
+ collectCounterSummary(store, threadMap, processIndexMap, index)
),
};
}
+/**
+ * Decide how to aggregate a counter's values per time bucket, and which tooltip
+ * format to render them with. Accumulated counters report the running level;
+ * rate counters report the amount summed over the bucket (using their
+ * range-aggregate row's format), except process CPU, which averages its ratio.
+ */
+function getOverTimeMode(display: CounterDisplayConfig): {
+ kind: 'level' | 'sum' | 'avg-ratio';
+ format: CounterTooltipFormat;
+} {
+ type ValueRow = Extract;
+ const rowFor = (source: CounterTooltipDataSource): ValueRow | undefined => {
+ for (const row of display.tooltipRows) {
+ if (row.type === 'value' && row.source === source) {
+ return row;
+ }
+ }
+ return undefined;
+ };
+ const fallback: CounterTooltipFormat = {
+ unit: display.unit === 'bytes' ? 'bytes' : 'number',
+ };
+
+ if (display.graphType === 'line-accumulated') {
+ return { kind: 'level', format: rowFor('accumulated')?.format ?? fallback };
+ }
+
+ const rangeRow = rowFor('count-range') ?? rowFor('committed-range-total');
+ if (rangeRow) {
+ return { kind: 'sum', format: rangeRow.format };
+ }
+ const cpuRow = rowFor('cpu-ratio');
+ if (cpuRow) {
+ return { kind: 'avg-ratio', format: cpuRow.format };
+ }
+ return { kind: 'sum', format: rowFor('count')?.format ?? fallback };
+}
+
+/**
+ * The sample indexes strictly inside the committed range. The counter
+ * selectors' committed range is padded by one sample on each side (for graph
+ * continuity); those boundary samples are outside the current view, so counts,
+ * sums, and time spans should exclude them.
+ */
+function getInRangeSampleIndexes(
+ store: Store,
+ counterIndex: CounterIndex
+): [number, number] {
+ const state = store.getState();
+ const { samples } = getCounterSelectors(counterIndex).getCounter(state);
+ const range = getCommittedRange(state);
+ return getSampleIndexRangeForSelection(samples, range.start, range.end);
+}
+
+type CounterBucket = {
+ startTime: number;
+ endTime: number;
+ value: number;
+ delta?: number; // accumulated counters only
+};
+
+type CounterBuckets = {
+ kind: 'level' | 'sum' | 'avg-ratio';
+ format: CounterTooltipFormat;
+ countRange: number; // for the accumulated (level) share
+ totalSum: number; // for the rate (sum) share
+ buckets: CounterBucket[];
+};
+
+/**
+ * Split the current committed range into `requestedBucketCount` equal-width time
+ * buckets and compute a raw value per bucket. Sample times are absolute. Shared
+ * by the detailed "over time" table and the sparkline.
+ *
+ * `capToSampleCount` keeps the table from showing more rows than there are
+ * samples; the sparkline leaves it off for a consistent width, filling
+ * sample-less buckets by carrying the level forward (accumulated) or with zero.
+ */
+function getCounterBuckets(
+ store: Store,
+ counterIndex: CounterIndex,
+ requestedBucketCount: number,
+ capToSampleCount: boolean
+): CounterBuckets | null {
+ const state = store.getState();
+ const selectors = getCounterSelectors(counterIndex);
+ const counter = selectors.getCounter(state);
+ const { samples, display } = counter;
+ const range = getCommittedRange(state);
+ const [startIndex, endIndex] = getInRangeSampleIndexes(store, counterIndex);
+ const { minCount, countRange, accumulatedCounts } =
+ selectors.getAccumulateCounterSamples(state);
+
+ const span = range.end - range.start;
+ if (endIndex <= startIndex || span <= 0) {
+ return null;
+ }
+
+ const { kind, format } = getOverTimeMode(display);
+ const interval = getProfileInterval(state);
+ // Use the same range-aware max as the timeline's cpu-ratio tooltip
+ // (getMaxRangeCounterSampleCountPerMs), so the CLI and UI agree.
+ const maxCountPerMs =
+ kind === 'avg-ratio'
+ ? selectors.getMaxRangeCounterSampleCountPerMs(state)
+ : 0;
+
+ const bucketCount = Math.max(
+ 1,
+ capToSampleCount
+ ? Math.min(requestedBucketCount, endIndex - startIndex)
+ : requestedBucketCount
+ );
+ const width = span / bucketCount;
+
+ type Acc = {
+ sum: number;
+ ratioSum: number;
+ ratioN: number;
+ level: number | null;
+ };
+ const accs: Acc[] = Array.from({ length: bucketCount }, () => ({
+ sum: 0,
+ ratioSum: 0,
+ ratioN: 0,
+ level: null,
+ }));
+
+ for (let i = startIndex; i < endIndex; i++) {
+ const bucketIndex = Math.min(
+ bucketCount - 1,
+ Math.max(0, Math.floor((samples.time[i] - range.start) / width))
+ );
+ const acc = accs[bucketIndex];
+ if (kind === 'level') {
+ acc.level = accumulatedCounts[i] - minCount;
+ } else if (kind === 'sum') {
+ acc.sum += samples.count[i];
+ } else {
+ const dt = i === 0 ? interval : samples.time[i] - samples.time[i - 1];
+ if (dt > 0 && maxCountPerMs > 0) {
+ acc.ratioSum += samples.count[i] / dt / maxCountPerMs;
+ acc.ratioN += 1;
+ }
+ }
+ }
+
+ const totalSum = accs.reduce((sum, acc) => sum + acc.sum, 0);
+
+ let carriedLevel = 0;
+ const buckets: CounterBucket[] = accs.map((acc, bucketIndex) => {
+ const startTime = range.start + bucketIndex * width;
+ const endTime =
+ bucketIndex === bucketCount - 1
+ ? range.end
+ : range.start + (bucketIndex + 1) * width;
+
+ let value: number;
+ let delta: number | undefined;
+ if (kind === 'level') {
+ const level = acc.level ?? carriedLevel;
+ delta = level - carriedLevel;
+ carriedLevel = level;
+ value = level;
+ } else if (kind === 'avg-ratio') {
+ value = acc.ratioN > 0 ? acc.ratioSum / acc.ratioN : 0;
+ } else {
+ value = acc.sum;
+ }
+ return { startTime, endTime, value, delta };
+ });
+
+ return { kind, format, countRange, totalSum, buckets };
+}
+
+/**
+ * The detailed "over time" table: a small number of buckets with formatted
+ * values, deltas, and per-slice shares. Rate buckets are shown as a share of the
+ * range total; accumulated buckets as a share of the range peak (countRange).
+ */
+function collectCounterOverTime(
+ store: Store,
+ counterIndex: CounterIndex,
+ timestampManager: TimestampManager
+): CounterTimeBucket[] {
+ const counterBuckets = getCounterBuckets(
+ store,
+ counterIndex,
+ OVER_TIME_BUCKET_COUNT,
+ true
+ );
+ if (counterBuckets === null) {
+ return [];
+ }
+ const meta = getMeta(store.getState());
+ const { kind, format, countRange, totalSum, buckets } = counterBuckets;
+
+ return buckets.map((bucket): CounterTimeBucket => {
+ const { formattedValue, carbon } = formatCounterRowValue(
+ bucket.value,
+ format,
+ meta
+ );
+
+ let formattedDelta: string | undefined;
+ if (bucket.delta !== undefined) {
+ if (bucket.delta === 0) {
+ formattedDelta = '0';
+ } else {
+ const sign = bucket.delta < 0 ? '-' : '+';
+ formattedDelta =
+ sign +
+ formatCounterRowValue(Math.abs(bucket.delta), format, meta)
+ .formattedValue;
+ }
+ }
+
+ let percentage: number | undefined;
+ if (kind === 'level' && countRange > 0) {
+ percentage = bucket.value / countRange;
+ } else if (kind === 'sum' && totalSum > 0) {
+ percentage = bucket.value / totalSum;
+ }
+ const formattedPercentage =
+ percentage !== undefined ? formatPercent(percentage) : undefined;
+
+ return {
+ startTime: bucket.startTime,
+ startTimeName: timestampManager.nameForTimestamp(bucket.startTime),
+ startTimeStr: timestampManager.timestampString(bucket.startTime),
+ endTime: bucket.endTime,
+ endTimeName: timestampManager.nameForTimestamp(bucket.endTime),
+ endTimeStr: timestampManager.timestampString(bucket.endTime),
+ value: bucket.value,
+ formattedValue,
+ delta: bucket.delta,
+ formattedDelta,
+ percentage,
+ formattedPercentage,
+ carbon,
+ };
+ });
+}
+
+/**
+ * A higher-resolution series of raw per-bucket values for the sparkline,
+ * independent of the detailed "over time" table's coarser buckets.
+ */
+function collectCounterGraph(
+ store: Store,
+ counterIndex: CounterIndex
+): number[] {
+ const counterBuckets = getCounterBuckets(
+ store,
+ counterIndex,
+ GRAPH_BUCKET_COUNT,
+ false
+ );
+ return counterBuckets === null
+ ? []
+ : counterBuckets.buckets.map((bucket) => bucket.value);
+}
+
/**
* Build detailed information about a single counter, resolved by handle.
*/
export function collectCounterInfo(
store: Store,
threadMap: ThreadMap,
+ processIndexMap: Map,
+ timestampManager: TimestampManager,
counterHandle: string
): CounterInfoResult {
const state = store.getState();
const counters = getCounters(state) ?? [];
const counterIndex = parseCounterHandle(counterHandle, counters.length);
- const summary = collectCounterSummary(store, threadMap, counterIndex);
+ const summary = collectCounterSummary(
+ store,
+ threadMap,
+ processIndexMap,
+ counterIndex
+ );
const selectors = getCounterSelectors(counterIndex);
const counter = selectors.getCounter(state);
- const [rangeStartIndex, rangeEndIndex] =
- selectors.getCommittedRangeCounterSampleRange(state);
+ const [rangeStartIndex, rangeEndIndex] = getInRangeSampleIndexes(
+ store,
+ counterIndex
+ );
- const zeroAt = getProfileRootRange(state).start;
+ // Sample times are already in absolute profile-time space (the same space as
+ // the committed range), so they need no zeroAt offset here.
const hasRange = rangeEndIndex > rangeStartIndex;
- const rangeStart = hasRange
- ? counter.samples.time[rangeStartIndex] + zeroAt
- : null;
- const rangeEnd = hasRange
- ? counter.samples.time[rangeEndIndex - 1] + zeroAt
- : null;
+ const rangeStart = hasRange ? counter.samples.time[rangeStartIndex] : null;
+ const rangeEnd = hasRange ? counter.samples.time[rangeEndIndex - 1] : null;
return {
...summary,
@@ -253,5 +551,6 @@ export function collectCounterInfo(
sampleCount: counter.samples.length,
rangeStart,
rangeEnd,
+ overTime: collectCounterOverTime(store, counterIndex, timestampManager),
};
}
diff --git a/src/profile-query/formatters/marker-info.ts b/src/profile-query/formatters/marker-info.ts
index a5bc461120..530c1fb164 100644
--- a/src/profile-query/formatters/marker-info.ts
+++ b/src/profile-query/formatters/marker-info.ts
@@ -8,7 +8,16 @@ import {
getCategories,
getMarkerSchemaByName,
getStringTable,
+ getCommittedRange,
} from 'firefox-profiler/selectors/profile';
+import {
+ intervalUnionMs,
+ peakConcurrency,
+ classifyCache,
+ gatherNetworkRecords,
+ clampInterval,
+ clampedDurationMs,
+} from '../network-summary';
import { getThreadSelectors } from 'firefox-profiler/selectors/per-thread';
import {
formatFromMarkerSchema,
@@ -35,6 +44,7 @@ import type {
ThreadMarkersResult,
ThreadNetworkResult,
NetworkRequestEntry,
+ NetworkRequestSort,
NetworkPhaseTimings,
MarkerGroupData,
DurationStats,
@@ -44,7 +54,6 @@ import type {
ProfileLogsResult,
} from '../types';
import {
- isNetworkMarker,
LOG_LEVEL_STRING_TO_LETTER,
LOG_LETTER_TO_LEVEL,
formatLogTimestamp,
@@ -1136,15 +1145,18 @@ function buildNetworkPhases(data: NetworkPayload): NetworkPhaseTimings {
export function collectThreadNetwork(
store: Store,
threadMap: ThreadMap,
+ markerMap: MarkerMap,
threadHandle?: string,
filterOptions: {
searchString?: string;
minDuration?: number;
maxDuration?: number;
limit?: number;
+ sort?: NetworkRequestSort;
} = {}
): ThreadNetworkResult {
const { searchString, minDuration, maxDuration, limit } = filterOptions;
+ const sort: NetworkRequestSort = filterOptions.sort ?? 'duration';
const state = store.getState();
const threadIndexes =
@@ -1154,36 +1166,53 @@ export function collectThreadNetwork(
const threadSelectors = getThreadSelectors(threadIndexes);
const friendlyThreadName = threadSelectors.getFriendlyThreadName(state);
- const fullMarkerList = threadSelectors.getFullMarkerList(state);
- const allMarkerIndexes = threadSelectors.getFullMarkerListIndexes(state);
-
- // Filter to completed (STOP) network markers only.
- // STOP markers are the merged markers that carry full timing data.
- const stopIndexes = allMarkerIndexes.filter((i) => {
- const m = fullMarkerList[i];
- if (!isNetworkMarker(m)) {
- return false;
+ const range = getCommittedRange(state);
+ const rangeDurationMs = range.end - range.start;
+
+ // Gather the derived network records through the shared helper, so this
+ // listing and the `profile info` / `thread info` summaries agree on what a
+ // request is: all legs intersecting the range, including redirect / cancel.
+ const [representativeIndex] = threadIndexes;
+ const records = gatherNetworkRecords(
+ state,
+ representativeIndex,
+ threadIndexes,
+ range
+ );
+
+ // Completed = STATUS_STOP; in flight = STATUS_START (no stop event). Redirect
+ // and cancel legs are listed but counted as neither; the formatter flags
+ // them so they aren't read as completed requests.
+ let totalRequestCount = 0;
+ let incompleteCount = 0;
+ for (const record of records) {
+ if (record.incomplete) {
+ incompleteCount++;
+ } else if (record.data.status === 'STATUS_STOP') {
+ totalRequestCount++;
}
- const data = m.data as NetworkPayload;
- return data.status === 'STATUS_STOP';
- });
- const totalRequestCount = stopIndexes.length;
+ }
+
+ // Wall-clock: interval union and peak concurrency over all records
+ // intersecting the range, independent of the display filters below.
+ const inFlightIntervals = records.map((record) =>
+ clampInterval(record, range)
+ );
+ const inFlightMs = intervalUnionMs(inFlightIntervals);
// Apply filters
- let filteredIndexes = stopIndexes;
+ let filteredRecords = records;
if (searchString) {
const lowerSearch = searchString.toLowerCase();
- filteredIndexes = filteredIndexes.filter((i) => {
- const data = fullMarkerList[i].data as NetworkPayload;
- return data.URI.toLowerCase().includes(lowerSearch);
- });
+ filteredRecords = filteredRecords.filter((record) =>
+ record.data.URI.toLowerCase().includes(lowerSearch)
+ );
}
if (minDuration !== undefined || maxDuration !== undefined) {
- filteredIndexes = filteredIndexes.filter((i) => {
- const data = fullMarkerList[i].data as NetworkPayload;
- const duration = data.endTime - data.startTime;
+ filteredRecords = filteredRecords.filter((record) => {
+ const duration = clampedDurationMs(record, range);
if (minDuration !== undefined && duration < minDuration) {
return false;
}
@@ -1194,7 +1223,7 @@ export function collectThreadNetwork(
});
}
- const filteredRequestCount = filteredIndexes.length;
+ const filteredRequestCount = filteredRecords.length;
// Accumulate summary stats across all filtered requests (before limit)
const phaseTotals: NetworkPhaseTimings = {};
@@ -1202,20 +1231,17 @@ export function collectThreadNetwork(
let cacheMiss = 0;
let cacheUnknown = 0;
- for (const i of filteredIndexes) {
- const data = fullMarkerList[i].data as NetworkPayload;
- const cache = data.cache;
- if (cache === 'Hit' || cache === 'MemoryHit' || cache === 'Prefetched') {
- cacheHit++;
- } else if (
- cache === 'Miss' ||
- cache === 'Unresolved' ||
- cache === 'DiskStorage' ||
- cache === 'Push'
- ) {
- cacheMiss++;
- } else {
- cacheUnknown++;
+ for (const record of filteredRecords) {
+ const data = record.data;
+ switch (classifyCache(data.cache)) {
+ case 'hit':
+ cacheHit++;
+ break;
+ case 'miss':
+ cacheMiss++;
+ break;
+ default:
+ cacheUnknown++;
}
const phases = buildNetworkPhases(data);
@@ -1240,26 +1266,44 @@ export function collectThreadNetwork(
}
}
- // Apply limit after accumulating summary stats.
+ // Sort before applying the limit so a limited window shows the intended
+ // requests (slowest by default; chronological with --sort start).
+ const sortedRecords = filteredRecords.slice();
+ if (sort === 'duration') {
+ sortedRecords.sort(
+ (a, b) => clampedDurationMs(b, range) - clampedDurationMs(a, range)
+ );
+ } else {
+ sortedRecords.sort((a, b) => a.start - b.start);
+ }
+
+ // Apply limit after accumulating summary stats and sorting.
// limit === 0 means "show all" (no limit).
- const limitedIndexes =
+ const limitedRecords =
limit !== undefined && limit > 0
- ? filteredIndexes.slice(0, limit)
- : filteredIndexes;
+ ? sortedRecords.slice(0, limit)
+ : sortedRecords;
// Build per-request entries
- const requests: NetworkRequestEntry[] = limitedIndexes.map((i) => {
- const data = fullMarkerList[i].data as NetworkPayload;
- const duration = data.endTime - data.startTime;
+ const requests: NetworkRequestEntry[] = limitedRecords.map((record) => {
+ const data = record.data;
+ const duration = clampedDurationMs(record, range);
return {
+ markerHandle: markerMap.handleForMarker(
+ record.threadIndexes,
+ record.markerIndex
+ ),
url: data.URI,
httpStatus: data.responseStatus,
httpVersion: data.httpVersion,
cacheStatus: data.cache,
transferSizeKB: data.count !== undefined ? data.count / 1024 : undefined,
- startTime: data.startTime,
+ startTime: record.start,
duration,
+ status: data.status,
+ incomplete: record.incomplete,
+ startedBeforeRecording: record.startedBeforeRecording,
phases: buildNetworkPhases(data),
};
});
@@ -1272,7 +1316,9 @@ export function collectThreadNetwork(
threadHandle: displayThreadHandle,
friendlyThreadName,
totalRequestCount,
+ incompleteCount,
filteredRequestCount,
+ sort,
filters:
searchString !== undefined ||
minDuration !== undefined ||
@@ -1284,6 +1330,11 @@ export function collectThreadNetwork(
cacheHit,
cacheMiss,
cacheUnknown,
+ inFlightMs,
+ inFlightPercentage:
+ rangeDurationMs > 0 ? (inFlightMs / rangeDurationMs) * 100 : 0,
+ peakConcurrency: peakConcurrency(inFlightIntervals),
+ rangeDurationMs,
phaseTotals,
},
requests,
diff --git a/src/profile-query/formatters/profile-info.ts b/src/profile-query/formatters/profile-info.ts
index 664738a18b..a5b111d2d6 100644
--- a/src/profile-query/formatters/profile-info.ts
+++ b/src/profile-query/formatters/profile-info.ts
@@ -8,13 +8,15 @@ import {
getRangeFilteredCombinedThreadActivitySlices,
} from 'firefox-profiler/selectors/profile';
import { getProfileNameWithDefault } from 'firefox-profiler/selectors/url-state';
-import { buildProcessThreadList } from '../process-thread-list';
+import { buildProcessThreadList, getProcessName } from '../process-thread-list';
import { collectSliceTree } from '../cpu-activity';
import { collectCounterSummary, getSortedCounterIndexes } from './counter-info';
+import { computeProfileNetworkSummary } from '../network-summary';
import type { Store } from '../../types/store';
import type { ThreadInfo, ProcessListItem } from '../process-thread-list';
import type { TimestampManager } from '../timestamps';
import type { ThreadMap } from '../thread-map';
+import type { MarkerMap } from '../marker-map';
import type { ProfileInfoResult, CounterSummary } from '../types';
/**
@@ -60,6 +62,7 @@ export function collectProfileInfo(
store: Store,
timestampManager: TimestampManager,
threadMap: ThreadMap,
+ markerMap: MarkerMap,
processIndexMap: Map,
showAll: boolean = false,
search?: string
@@ -92,10 +95,7 @@ export function collectProfileInfo(
(t) => t.pid === processItem.pid
);
if (threadFromProcess) {
- processItem.name =
- threadFromProcess.processName ||
- threadFromProcess.processType ||
- 'unknown';
+ processItem.name = getProcessName(threadFromProcess);
processItem.etld1 = threadFromProcess['eTLD+1'];
processItem.startTime = threadFromProcess.processStartupTime;
processItem.endTime = threadFromProcess.processShutdownTime;
@@ -110,7 +110,12 @@ export function collectProfileInfo(
const countersByPid = new Map();
for (const index of getSortedCounterIndexes(store)) {
- const counter = collectCounterSummary(store, threadMap, index);
+ const counter = collectCounterSummary(
+ store,
+ threadMap,
+ processIndexMap,
+ index
+ );
const list = countersByPid.get(counter.pid) ?? [];
list.push(counter);
countersByPid.set(counter.pid, list);
@@ -162,6 +167,12 @@ export function collectProfileInfo(
? collectSliceTree(combinedCpuActivity, timestampManager)
: null;
+ const networkActivity = computeProfileNetworkSummary(
+ store,
+ threadMap,
+ markerMap
+ );
+
return {
type: 'profile-info',
name: profileName || 'Unknown Profile',
@@ -174,5 +185,6 @@ export function collectProfileInfo(
remainingProcesses:
search !== undefined ? undefined : result.remainingProcesses,
cpuActivity,
+ networkActivity,
};
}
diff --git a/src/profile-query/formatters/profile-meta.ts b/src/profile-query/formatters/profile-meta.ts
new file mode 100644
index 0000000000..2242a22701
--- /dev/null
+++ b/src/profile-query/formatters/profile-meta.ts
@@ -0,0 +1,184 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { getProfile } from 'firefox-profiler/selectors/profile';
+import {
+ formatProductAndVersion,
+ formatPlatform,
+} from 'firefox-profiler/profile-logic/profile-metainfo';
+import { formatFromMarkerSchema } from 'firefox-profiler/profile-logic/marker-schema';
+import { StringTable } from 'firefox-profiler/utils/string-table';
+import type { Store } from '../../types/store';
+import type { ProfileMetaResult } from '../types';
+
+/**
+ * Collect the profile's `meta` field into a structured, grouped result. This
+ * mirrors what the "Profile Info" panel renders in the web UI, reusing the same
+ * formatting helpers so the CLI and the UI stay consistent.
+ */
+export function collectProfileMeta(store: Store): ProfileMetaResult {
+ const { meta } = getProfile(store.getState());
+
+ const result: ProfileMetaResult = {
+ type: 'profile-meta',
+ interval: meta.interval,
+ product: meta.product,
+ };
+
+ // ===== Recording =====
+ // When profilingStartTime is present, startTime + profilingStartTime is the
+ // moment recording actually began. Otherwise fall back to the raw startTime.
+ const startTime =
+ meta.profilingStartTime !== undefined
+ ? meta.startTime + meta.profilingStartTime
+ : meta.startTime;
+ if (startTime !== undefined) {
+ result.startTime = startTime;
+ result.startTimeFormatted = new Date(startTime).toISOString();
+ }
+
+ let durationMs;
+ if (
+ meta.profilingStartTime !== undefined &&
+ meta.profilingEndTime !== undefined
+ ) {
+ durationMs = meta.profilingEndTime - meta.profilingStartTime;
+ } else if (meta.endTime !== undefined) {
+ durationMs = meta.endTime - (meta.profilingStartTime ?? 0);
+ }
+ if (durationMs !== undefined) {
+ result.durationMs = durationMs;
+ }
+
+ if (meta.endTime !== undefined) {
+ result.endTime = meta.endTime;
+ result.endTimeFormatted = new Date(meta.endTime).toISOString();
+ }
+
+ if (meta.symbolicated !== undefined) {
+ result.symbolicated = meta.symbolicated;
+ }
+
+ const { configuration } = meta;
+ if (configuration) {
+ // Capacity is stored in entries of 8 bytes each.
+ result.bufferCapacityBytes = configuration.capacity * 8;
+ if (configuration.duration !== undefined) {
+ result.bufferDuration = configuration.duration;
+ }
+ if (configuration.features.length) {
+ result.features = configuration.features;
+ }
+ if (configuration.threads.length) {
+ result.threadsFilter = configuration.threads;
+ }
+ }
+
+ // ===== Application =====
+ const productAndVersion = formatProductAndVersion(meta);
+ if (productAndVersion) {
+ result.productAndVersion = productAndVersion;
+ }
+ if (meta.profilingStartTime !== undefined) {
+ result.uptimeMs = meta.profilingStartTime;
+ }
+ if (meta.appBuildID !== undefined) {
+ result.appBuildID = meta.appBuildID;
+ }
+ if (meta.sourceURL !== undefined) {
+ result.sourceURL = meta.sourceURL;
+ }
+ if (meta.updateChannel !== undefined) {
+ result.updateChannel = meta.updateChannel;
+ }
+ if (meta.debug !== undefined) {
+ result.debug = meta.debug;
+ }
+ if (meta.arguments !== undefined) {
+ result.arguments = meta.arguments;
+ }
+ if (meta.extensions && meta.extensions.length) {
+ const { extensions } = meta;
+ const list = [];
+ for (let i = 0; i < extensions.length; i++) {
+ const entry: { name: string; id: string; baseURL?: string } = {
+ name: extensions.name[i],
+ id: extensions.id[i],
+ };
+ if (extensions.baseURL[i] !== undefined) {
+ entry.baseURL = extensions.baseURL[i];
+ }
+ list.push(entry);
+ }
+ list.sort((a, b) => a.name.localeCompare(b.name));
+ result.extensions = list;
+ }
+
+ // ===== Platform =====
+ const platform = formatPlatform(meta);
+ if (platform) {
+ result.platform = platform;
+ }
+ if (meta.oscpu !== undefined) {
+ result.oscpu = meta.oscpu;
+ }
+ if (meta.abi !== undefined) {
+ result.abi = meta.abi;
+ }
+ if (meta.device !== undefined) {
+ result.device = meta.device;
+ }
+ if (meta.CPUName !== undefined) {
+ result.cpuName = meta.CPUName;
+ }
+ if (meta.physicalCPUs !== undefined) {
+ result.physicalCPUs = meta.physicalCPUs;
+ }
+ if (meta.logicalCPUs !== undefined) {
+ result.logicalCPUs = meta.logicalCPUs;
+ }
+ if (meta.mainMemory !== undefined) {
+ result.mainMemoryBytes = meta.mainMemory;
+ }
+
+ // ===== Import / misc =====
+ if (meta.importedFrom !== undefined) {
+ result.importedFrom = meta.importedFrom;
+ }
+ if (meta.fileName !== undefined) {
+ result.fileName = meta.fileName;
+ }
+ if (meta.fileSize !== undefined) {
+ result.fileSize = meta.fileSize;
+ }
+ if (meta.version !== undefined) {
+ result.version = meta.version;
+ }
+ if (meta.preprocessedProfileVersion !== undefined) {
+ result.preprocessedProfileVersion = meta.preprocessedProfileVersion;
+ }
+ if (meta.sampleUnits !== undefined) {
+ result.sampleUnits = meta.sampleUnits;
+ }
+
+ // ===== Extra =====
+ if (meta.extra && meta.extra.length) {
+ const stringTable = StringTable.withBackingArray([]);
+ result.extra = meta.extra.map((section) => ({
+ label: section.label,
+ entries: section.entries.map((entry) => ({
+ label: entry.label,
+ value: entry.value,
+ formatted: formatFromMarkerSchema(
+ 'moreInfo',
+ entry.format,
+ entry.value,
+ stringTable
+ ),
+ })),
+ }));
+ }
+
+ return result;
+}
diff --git a/src/profile-query/formatters/thread-info.ts b/src/profile-query/formatters/thread-info.ts
index 912100061a..96095e4ffc 100644
--- a/src/profile-query/formatters/thread-info.ts
+++ b/src/profile-query/formatters/thread-info.ts
@@ -12,6 +12,7 @@ import {
getProfile,
} from 'firefox-profiler/selectors/profile';
import { collectSliceTree } from '../cpu-activity';
+import { computeThreadNetworkSummary } from '../network-summary';
import { getThreadSelectors } from 'firefox-profiler/selectors/per-thread';
import type {
ThreadInfoResult,
@@ -38,6 +39,7 @@ import type { Store } from '../../types/store';
import type { TimestampManager } from '../timestamps';
import type { ThreadMap } from '../thread-map';
import { getFunctionHandle } from '../function-map';
+import type { MarkerMap } from '../marker-map';
import type { CallNodePath } from 'firefox-profiler/types';
/**
@@ -47,6 +49,7 @@ export function collectThreadInfo(
store: Store,
timestampManager: TimestampManager,
threadMap: ThreadMap,
+ markerMap: MarkerMap,
threadHandle?: string
): ThreadInfoResult {
const state = store.getState();
@@ -64,6 +67,13 @@ export function collectThreadInfo(
? collectSliceTree(cpuActivitySlices, timestampManager)
: null;
+ const networkActivity = computeThreadNetworkSummary(
+ store,
+ threadIndexes,
+ markerMap,
+ threadMap
+ );
+
const actualThreadHandle =
threadHandle ?? threadMap.handleForThreadIndexes(threadIndexes);
@@ -83,6 +93,7 @@ export function collectThreadInfo(
sampleCount: thread.samples.length,
markerCount: thread.markers.length,
cpuActivity,
+ networkActivity,
};
}
diff --git a/src/profile-query/index.ts b/src/profile-query/index.ts
index 73d9959263..164b524403 100644
--- a/src/profile-query/index.ts
+++ b/src/profile-query/index.ts
@@ -47,6 +47,7 @@ import { getLibForFunc } from './function-list';
import { MarkerMap } from './marker-map';
import { loadProfileFromFileOrUrl, type LoadOptions } from './loader';
import { collectProfileInfo } from './formatters/profile-info';
+import { collectProfileMeta } from './formatters/profile-meta';
import {
collectThreadInfo,
collectThreadSamples,
@@ -88,11 +89,13 @@ import type {
MarkerStackResult,
MarkerInfoResult,
ProfileInfoResult,
+ ProfileMetaResult,
ThreadSamplesResult,
ThreadSamplesTopDownResult,
ThreadSamplesBottomUpResult,
ThreadMarkersResult,
ThreadNetworkResult,
+ NetworkRequestSort,
ThreadFunctionsResult,
ThreadPageLoadResult,
ProfileLogsResult,
@@ -212,6 +215,7 @@ export class ProfileQuerier {
this._store,
this._timestampManager,
this._threadMap,
+ this._markerMap,
this._processIndexMap,
showAll,
search
@@ -219,8 +223,16 @@ export class ProfileQuerier {
return { ...result, context: this._getContext() };
}
+ async profileMeta(): Promise> {
+ return { ...collectProfileMeta(this._store), context: this._getContext() };
+ }
+
async counterList(): Promise> {
- const result = collectCounterList(this._store, this._threadMap);
+ const result = collectCounterList(
+ this._store,
+ this._threadMap,
+ this._processIndexMap
+ );
return { ...result, context: this._getContext() };
}
@@ -230,6 +242,8 @@ export class ProfileQuerier {
const result = collectCounterInfo(
this._store,
this._threadMap,
+ this._processIndexMap,
+ this._timestampManager,
counterHandle
);
return { ...result, context: this._getContext() };
@@ -242,6 +256,7 @@ export class ProfileQuerier {
this._store,
this._timestampManager,
this._threadMap,
+ this._markerMap,
threadHandle
);
return { ...result, context: this._getContext() };
@@ -1042,11 +1057,13 @@ export class ProfileQuerier {
minDuration?: number;
maxDuration?: number;
limit?: number;
+ sort?: NetworkRequestSort;
}
): Promise> {
const result = collectThreadNetwork(
this._store,
this._threadMap,
+ this._markerMap,
threadHandle,
filterOptions
);
diff --git a/src/profile-query/network-summary.ts b/src/profile-query/network-summary.ts
new file mode 100644
index 0000000000..8c24aaef2e
--- /dev/null
+++ b/src/profile-query/network-summary.ts
@@ -0,0 +1,453 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { getThreadSelectors } from 'firefox-profiler/selectors/per-thread';
+import {
+ getCommittedRange,
+ getProfile,
+} from 'firefox-profiler/selectors/profile';
+import { isNetworkMarker } from 'firefox-profiler/profile-logic/marker-data';
+import type { Store } from '../types/store';
+import type {
+ ThreadIndex,
+ MarkerIndex,
+ StartEndRange,
+} from 'firefox-profiler/types';
+import type { NetworkPayload } from 'firefox-profiler/types/markers';
+import type { ThreadMap } from './thread-map';
+import type { MarkerMap } from './marker-map';
+import type {
+ NetworkSummaryRequest,
+ ThreadNetworkSummary,
+ ProfileNetworkSummary,
+ ProfileNetworkThreadBreakdown,
+} from './types';
+
+type State = ReturnType;
+
+/**
+ * One derived network marker, resolved to absolute times and a handle.
+ */
+export type NetworkRecord = {
+ threadIndex: ThreadIndex;
+ threadIndexes: Set;
+ markerIndex: MarkerIndex;
+ data: NetworkPayload;
+ start: number;
+ end: number;
+ // In flight at the end of the recording (only a START event, no stop).
+ incomplete: boolean;
+ // Completed, but its START event predates the recording; duration is a
+ // lower bound.
+ startedBeforeRecording: boolean;
+};
+
+/**
+ * Classify a request's cache status into hit / miss / unknown buckets.
+ */
+export function classifyCache(
+ cache: string | undefined
+): 'hit' | 'miss' | 'unknown' {
+ // The strings are produced by Firefox's GetCacheState:
+ // https://searchfox.org/firefox-main/rev/3ed11452652b84dea6d27db877a401a146e44ba3/netwerk/protocol/http/NetworkMarker.cpp#140
+ // "Unresolved" is the undetermined default, so it counts as unknown rather than a miss.
+ if (cache === 'Hit' || cache === 'HitViaReval') {
+ return 'hit';
+ }
+ if (cache === 'Missed' || cache === 'MissedViaReval') {
+ return 'miss';
+ }
+ return 'unknown';
+}
+
+/**
+ * Cheap pre-scan of a thread's raw marker data for any Network payload. Used to
+ * skip marker derivation for the majority of threads that never touch the
+ * network (profiles can have >100 threads).
+ */
+function threadHasRawNetworkMarker(
+ state: State,
+ threadIndex: ThreadIndex
+): boolean {
+ const selectors = getThreadSelectors(new Set([threadIndex]));
+ const rawThread = selectors.getRawThread(state);
+ const dataColumn = rawThread.markers.data;
+ for (let i = 0; i < dataColumn.length; i++) {
+ const data = dataColumn[i];
+ if (data && data.type === 'Network') {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * Gather the derived network markers for a thread set that intersect `range`.
+ * Times are absolute (same scale as `range`); intervals are clamped by callers.
+ */
+export function gatherNetworkRecords(
+ state: State,
+ threadIndex: ThreadIndex,
+ threadIndexes: Set,
+ range: StartEndRange
+): NetworkRecord[] {
+ const selectors = getThreadSelectors(threadIndexes);
+ const fullMarkerList = selectors.getFullMarkerList(state);
+ const indexes = selectors.getFullMarkerListIndexes(state);
+ const records: NetworkRecord[] = [];
+ for (const i of indexes) {
+ const marker = fullMarkerList[i];
+ if (!isNetworkMarker(marker)) {
+ continue;
+ }
+ const start = marker.start;
+ const end = marker.end ?? marker.start;
+ // Only markers intersecting the range count.
+ if (end < range.start || start > range.end) {
+ continue;
+ }
+ const data = marker.data as NetworkPayload;
+ // "In flight at end" is keyed off the status, not the derived `incomplete`
+ // flag: that flag is also set for a STOP whose START predates the recording,
+ // which did complete.
+ const inFlight = data.status === 'STATUS_START';
+ records.push({
+ threadIndex,
+ threadIndexes,
+ markerIndex: i,
+ data,
+ start,
+ end,
+ incomplete: inFlight,
+ startedBeforeRecording: marker.incomplete === true && !inFlight,
+ });
+ }
+ return records;
+}
+
+/**
+ * Interval union: total wall-clock time covered by any interval. Intervals are
+ * [start, end] pairs already clamped to the range.
+ */
+export function intervalUnionMs(intervals: Array<[number, number]>): number {
+ if (intervals.length === 0) {
+ return 0;
+ }
+
+ const sorted = intervals.slice().sort((a, b) => a[0] - b[0]);
+ let total = 0;
+ let [curStart, curEnd] = sorted[0];
+
+ for (let i = 1; i < sorted.length; i++) {
+ const [start, end] = sorted[i];
+ if (start > curEnd) {
+ total += curEnd - curStart;
+ curStart = start;
+ curEnd = end;
+ } else if (end > curEnd) {
+ curEnd = end;
+ }
+ }
+ total += curEnd - curStart;
+ return total;
+}
+
+/**
+ * Peak concurrency: the maximum number of intervals overlapping at any instant.
+ * A request that ends exactly when another starts is not double-counted (ends
+ * are processed before starts at the same timestamp).
+ */
+export function peakConcurrency(intervals: Array<[number, number]>): number {
+ const events: Array<[number, number]> = [];
+ for (const [start, end] of intervals) {
+ events.push([start, 1]);
+ events.push([end, -1]);
+ }
+ events.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
+ let current = 0;
+ let peak = 0;
+ for (const [, delta] of events) {
+ current += delta;
+ if (current > peak) {
+ peak = current;
+ }
+ }
+ return peak;
+}
+
+/**
+ * Clamp a record's interval to the range.
+ */
+export function clampInterval(
+ record: NetworkRecord,
+ range: StartEndRange
+): [number, number] {
+ return [Math.max(record.start, range.start), Math.min(record.end, range.end)];
+}
+
+/**
+ * The request's in-range duration. A request can start before the range or end
+ * after it; clamping keeps the reported duration from exceeding what the
+ * profile can actually show.
+ */
+export function clampedDurationMs(
+ record: NetworkRecord,
+ range: StartEndRange
+): number {
+ const [start, end] = clampInterval(record, range);
+ return end - start;
+}
+
+function toSummaryRequest(
+ record: NetworkRecord,
+ range: StartEndRange,
+ markerMap: MarkerMap,
+ threadMap: ThreadMap
+): NetworkSummaryRequest {
+ const durationMs = clampedDurationMs(record, range);
+ const { count, URI, responseStatus } = record.data;
+ return {
+ markerHandle: markerMap.handleForMarker(
+ record.threadIndexes,
+ record.markerIndex
+ ),
+ threadHandle: threadMap.handleForThreadIndexes(record.threadIndexes),
+ url: URI,
+ durationMs,
+ startTime: record.start,
+ transferSizeKB: count !== undefined ? count / 1024 : undefined,
+ httpStatus: responseStatus,
+ status: record.data.status,
+ incomplete: record.incomplete,
+ startedBeforeRecording: record.startedBeforeRecording,
+ };
+}
+
+/**
+ * Sort records by in-range duration descending and take the top N as
+ * summary-request entries.
+ */
+function topSlowest(
+ records: NetworkRecord[],
+ range: StartEndRange,
+ n: number,
+ markerMap: MarkerMap,
+ threadMap: ThreadMap
+): NetworkSummaryRequest[] {
+ return records
+ .slice()
+ .sort((a, b) => clampedDurationMs(b, range) - clampedDurationMs(a, range))
+ .slice(0, n)
+ .map((record) => toSummaryRequest(record, range, markerMap, threadMap));
+}
+
+function isCompleted(record: NetworkRecord): boolean {
+ return record.data.status === 'STATUS_STOP';
+}
+
+/**
+ * Compute a network summary for one thread (or combined thread set), scoped to
+ * the current committed range. Returns null when the thread has no network
+ * markers, so callers can omit the section entirely.
+ */
+export function computeThreadNetworkSummary(
+ store: Store,
+ threadIndexes: Set,
+ markerMap: MarkerMap,
+ threadMap: ThreadMap
+): ThreadNetworkSummary | null {
+ const state = store.getState();
+ // Pre-scan raw data so a combined selection with no network markers doesn't
+ // trigger derivation.
+ const hasNetwork = Array.from(threadIndexes).some((index) =>
+ threadHasRawNetworkMarker(state, index)
+ );
+ if (!hasNetwork) {
+ return null;
+ }
+
+ const range = getCommittedRange(state);
+ // Use the combined selectors so the marker handle matches this exact thread
+ // selection (which is what `zoom push m-N` will resolve against). Pick a
+ // representative single index only for the record's threadIndex field.
+ const [representativeIndex] = threadIndexes;
+ const records = gatherNetworkRecords(
+ state,
+ representativeIndex,
+ threadIndexes,
+ range
+ );
+ if (records.length === 0) {
+ return null;
+ }
+
+ const rangeDurationMs = range.end - range.start;
+ const intervals = records.map((record) => clampInterval(record, range));
+ const inFlightMs = intervalUnionMs(intervals);
+
+ let requestCount = 0;
+ let incompleteCount = 0;
+ let errorCount = 0;
+ let cacheHit = 0;
+ let cacheMiss = 0;
+ let cacheUnknown = 0;
+ for (const record of records) {
+ if (record.incomplete) {
+ incompleteCount++;
+ } else if (isCompleted(record)) {
+ requestCount++;
+ }
+ if (
+ record.data.responseStatus !== undefined &&
+ record.data.responseStatus >= 400
+ ) {
+ errorCount++;
+ }
+ switch (classifyCache(record.data.cache)) {
+ case 'hit':
+ cacheHit++;
+ break;
+ case 'miss':
+ cacheMiss++;
+ break;
+ default:
+ cacheUnknown++;
+ }
+ }
+
+ return {
+ threadHandle: threadMap.handleForThreadIndexes(threadIndexes),
+ threadName: getThreadSelectors(threadIndexes).getFriendlyThreadName(state),
+ requestCount,
+ incompleteCount,
+ inFlightMs,
+ inFlightPercentage:
+ rangeDurationMs > 0 ? (inFlightMs / rangeDurationMs) * 100 : 0,
+ peakConcurrency: peakConcurrency(intervals),
+ errorCount,
+ cacheHit,
+ cacheMiss,
+ cacheUnknown,
+ rangeDurationMs,
+ slowest: topSlowest(records, range, 3, markerMap, threadMap),
+ };
+}
+
+/**
+ * Dedupe records across processes for the profile-wide numbers. The parent
+ * process (necko) carries a copy of every request, so raw counts double-count.
+ * Key on channel id + URI; prefer the content-process copy (it has
+ * innerWindowID / page attribution).
+ */
+function dedupeRecords(records: NetworkRecord[]): NetworkRecord[] {
+ const byKey = new Map();
+ for (const record of records) {
+ const key = `${record.data.id}|${record.data.URI}`;
+ const existing = byKey.get(key);
+ if (existing === undefined) {
+ byKey.set(key, record);
+ continue;
+ }
+ // Prefer the copy with page attribution (content process).
+ const existingHasWindow = existing.data.innerWindowID !== undefined;
+ const candidateHasWindow = record.data.innerWindowID !== undefined;
+ if (candidateHasWindow && !existingHasWindow) {
+ byKey.set(key, record);
+ }
+ }
+ return Array.from(byKey.values());
+}
+
+/**
+ * Compute the profile-wide network summary. Runs the per-thread scan for every
+ * thread that passed the raw pre-scan, dedupes across processes for the
+ * headline numbers, and keeps per-thread (non-deduped) counts in `byThread`.
+ * Returns null when no thread has network markers.
+ */
+export function computeProfileNetworkSummary(
+ store: Store,
+ threadMap: ThreadMap,
+ markerMap: MarkerMap
+): ProfileNetworkSummary | null {
+ const state = store.getState();
+ const range = getCommittedRange(state);
+ const rangeDurationMs = range.end - range.start;
+
+ const allRecords: NetworkRecord[] = [];
+ const byThread: ProfileNetworkThreadBreakdown[] = [];
+
+ const threadCount = getProfile(state).threads.length;
+ for (let threadIndex = 0; threadIndex < threadCount; threadIndex++) {
+ if (!threadHasRawNetworkMarker(state, threadIndex)) {
+ continue;
+ }
+ const threadIndexes = new Set([threadIndex]);
+ const records = gatherNetworkRecords(
+ state,
+ threadIndex,
+ threadIndexes,
+ range
+ );
+ if (records.length === 0) {
+ continue;
+ }
+ allRecords.push(...records);
+
+ const threadIntervals = records.map((record) =>
+ clampInterval(record, range)
+ );
+ const threadRequestCount = records.filter(
+ (record) => isCompleted(record) || record.incomplete
+ ).length;
+ byThread.push({
+ threadHandle: threadMap.handleForThreadIndexes(threadIndexes),
+ threadName:
+ getThreadSelectors(threadIndexes).getFriendlyThreadName(state),
+ requestCount: threadRequestCount,
+ inFlightMs: intervalUnionMs(threadIntervals),
+ });
+ }
+
+ if (allRecords.length === 0) {
+ return null;
+ }
+
+ const deduped = dedupeRecords(allRecords);
+ const dedupedIntervals = deduped.map((record) =>
+ clampInterval(record, range)
+ );
+ const inFlightMs = intervalUnionMs(dedupedIntervals);
+
+ let requestCount = 0;
+ let incompleteCount = 0;
+ let errorCount = 0;
+ for (const record of deduped) {
+ if (record.incomplete) {
+ incompleteCount++;
+ } else if (isCompleted(record)) {
+ requestCount++;
+ }
+ if (
+ record.data.responseStatus !== undefined &&
+ record.data.responseStatus >= 400
+ ) {
+ errorCount++;
+ }
+ }
+
+ byThread.sort((a, b) => b.inFlightMs - a.inFlightMs);
+
+ return {
+ requestCount,
+ incompleteCount,
+ inFlightMs,
+ inFlightPercentage:
+ rangeDurationMs > 0 ? (inFlightMs / rangeDurationMs) * 100 : 0,
+ peakConcurrency: peakConcurrency(dedupedIntervals),
+ errorCount,
+ rangeDurationMs,
+ slowest: topSlowest(deduped, range, 5, markerMap, threadMap),
+ byThread: byThread.slice(0, 5),
+ };
+}
diff --git a/src/profile-query/process-thread-list.ts b/src/profile-query/process-thread-list.ts
index 0c9ae36b9c..bb5ccaeaf9 100644
--- a/src/profile-query/process-thread-list.ts
+++ b/src/profile-query/process-thread-list.ts
@@ -2,6 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+import type { RawThread } from 'firefox-profiler/types';
+
+/** The display name of the process a thread belongs to. */
+export function getProcessName(thread: RawThread): string {
+ return thread.processName || thread.processType || 'unknown';
+}
+
export type ThreadInfo = {
threadIndex: number;
name: string;
diff --git a/src/profile-query/types.ts b/src/profile-query/types.ts
index 65e1135b3a..536c6d908f 100644
--- a/src/profile-query/types.ts
+++ b/src/profile-query/types.ts
@@ -11,6 +11,8 @@ import type {
Transform,
CounterGraphType,
CounterTooltipDataSource,
+ NetworkStatus,
+ SampleUnits,
} from 'firefox-profiler/types';
// ===== Utility types =====
@@ -309,6 +311,7 @@ export type ThreadInfoResult = {
cpuMs: number;
depthLevel: number;
}> | null;
+ networkActivity: ThreadNetworkSummary | null;
};
export type TopFunctionInfo = FunctionDisplayInfo & {
@@ -427,7 +430,10 @@ export type NetworkPhaseTimings = {
mainThread?: number;
};
+export type NetworkRequestSort = 'start' | 'duration';
+
export type NetworkRequestEntry = {
+ markerHandle: string;
url: string;
httpStatus?: number;
httpVersion?: string;
@@ -435,6 +441,17 @@ export type NetworkRequestEntry = {
transferSizeKB?: number;
startTime: number;
duration: number;
+ // The derived marker's status. STATUS_REDIRECT / STATUS_CANCEL legs are
+ // listed alongside completed requests but flagged so they aren't mistaken
+ // for them.
+ status: NetworkStatus;
+ // True when the request was still in flight when the recording stopped
+ // (only a START event, no stop); its duration is measured until the end of
+ // the recording.
+ incomplete: boolean;
+ // True when the request completed during the recording but its START event
+ // predates it, so the reported duration is a lower bound.
+ startedBeforeRecording: boolean;
phases: NetworkPhaseTimings;
};
@@ -443,7 +460,11 @@ export type ThreadNetworkResult = {
threadHandle: string;
friendlyThreadName: string;
totalRequestCount: number;
+ // Requests still in flight when the recording stopped.
+ incompleteCount: number;
filteredRequestCount: number;
+ // How the request list is ordered.
+ sort: NetworkRequestSort;
filters?: {
searchString?: string;
minDuration?: number;
@@ -454,11 +475,95 @@ export type ThreadNetworkResult = {
cacheHit: number;
cacheMiss: number;
cacheUnknown: number;
+ // Interval union of all requests intersecting the range: wall-clock
+ // time, unlike the summed phase totals.
+ inFlightMs: number;
+ inFlightPercentage: number;
+ peakConcurrency: number;
+ rangeDurationMs: number;
phaseTotals: NetworkPhaseTimings;
};
requests: NetworkRequestEntry[];
};
+/**
+ * A single network request surfaced in a network summary (profile- or
+ * thread-level). Carries handles so the next drill-down command
+ * (`zoom push m-N`, `marker info m-N`) is obvious.
+ */
+export type NetworkSummaryRequest = {
+ markerHandle: string;
+ threadHandle: string;
+ url: string;
+ durationMs: number;
+ startTime: number;
+ transferSizeKB?: number;
+ httpStatus?: number;
+ // The derived marker's status. STATUS_REDIRECT / STATUS_CANCEL legs are
+ // surfaced (they carry in-flight time and the pre-redirect URL) but are not
+ // completed requests, so the formatter labels them.
+ status: NetworkStatus;
+ // True when the request was still in flight when the recording stopped.
+ incomplete: boolean;
+ // True when the request completed but its START event predates the
+ // recording, so the reported duration is a lower bound.
+ startedBeforeRecording: boolean;
+};
+
+/**
+ * Network activity summary for a single thread, scoped to the current range.
+ * The headline metric is `inFlightPercentage` (interval-union "in flight"
+ * time), which unlike summed phase durations can't exceed the wall clock.
+ */
+export type ThreadNetworkSummary = {
+ threadHandle: string;
+ threadName: string;
+ // Completed (STATUS_STOP) requests intersecting the range.
+ requestCount: number;
+ // Requests still in flight when the recording stopped.
+ incompleteCount: number;
+ // Interval union of all (clamped) request intervals.
+ inFlightMs: number;
+ inFlightPercentage: number;
+ // Max simultaneous in-flight requests.
+ peakConcurrency: number;
+ // Requests with responseStatus >= 400.
+ errorCount: number;
+ cacheHit: number;
+ cacheMiss: number;
+ cacheUnknown: number;
+ rangeDurationMs: number;
+ slowest: NetworkSummaryRequest[];
+};
+
+/**
+ * Per-thread breakdown row in a profile-wide network summary. Counts are the
+ * thread's own (not deduped) so process attribution stays visible.
+ */
+export type ProfileNetworkThreadBreakdown = {
+ threadHandle: string;
+ threadName: string;
+ requestCount: number;
+ inFlightMs: number;
+};
+
+/**
+ * Profile-wide network summary. The headline numbers are deduped across
+ * processes (the parent process carries a copy of every request), while
+ * `byThread` keeps each thread's own counts for attribution.
+ */
+export type ProfileNetworkSummary = {
+ requestCount: number;
+ incompleteCount: number;
+ inFlightMs: number;
+ inFlightPercentage: number;
+ peakConcurrency: number;
+ errorCount: number;
+ rangeDurationMs: number;
+ slowest: NetworkSummaryRequest[];
+ byThread: ProfileNetworkThreadBreakdown[];
+};
+
export type ThreadMarkersResult = {
type: 'thread-markers';
threadHandle: string;
@@ -699,11 +804,17 @@ export type CounterSummary = {
graphType: CounterGraphType;
color: string;
pid: string;
+ processIndex: number;
+ processName: string; // e.g. "Parent Process"
+ etld1?: string; // eTLD+1 of an isolated content process, when known
mainThreadIndex: number;
mainThreadHandle: string; // e.g. "t-0"
mainThreadName: string;
rangeSampleCount: number; // samples within the current range
stats: CounterStat[]; // range-aggregate stats from the tooltip schema
+ // Raw values for a sparkline of the counter's trajectory over the current
+ // view. Empty when the counter has no in-range samples.
+ graph: number[];
};
export type CounterListResult = {
@@ -711,12 +822,37 @@ export type CounterListResult = {
counters: CounterSummary[];
};
+/**
+ * One time bucket of a counter's "over time" breakdown. The current view is
+ * split into equal-width buckets; each carries the bucket's value formatted via
+ * the tooltip schema. `delta` is present only for accumulated counters.
+ */
+export type CounterTimeBucket = {
+ startTime: number; // absolute time of the bucket start
+ startTimeName: string; // e.g. "ts-0"
+ startTimeStr: string; // human-readable, relative to profile start, e.g. "1.4s"
+ endTime: number;
+ endTimeName: string;
+ endTimeStr: string;
+ value: number;
+ formattedValue: string;
+ delta?: number;
+ formattedDelta?: string; // signed, e.g. "+6.3 MB"
+ // Ratio (0..1) of the bucket's value: share of the range total for rate
+ // counters, share of the range peak for accumulated counters. Omitted for
+ // process CPU, whose value is already a percentage.
+ percentage?: number;
+ formattedPercentage?: string; // e.g. "60%"
+ carbon?: string; // when the row's format requests a CO2e estimate
+};
+
export type CounterInfoResult = CounterSummary & {
type: 'counter-info';
description: string;
sampleCount: number; // total samples in the counter (whole profile)
rangeStart: number | null; // absolute time of first in-range sample
rangeEnd: number | null; // absolute time of last in-range sample
+ overTime: CounterTimeBucket[]; // per-bucket values across the current view
};
// ===== Profile Commands =====
@@ -768,4 +904,73 @@ export type ProfileInfoResult = {
cpuMs: number;
depthLevel: number;
}> | null;
+ networkActivity: ProfileNetworkSummary | null;
+};
+
+/**
+ * Structured view of the profile's `meta` field, mirroring the "Profile Info"
+ * panel in the web UI (`src/components/app/MenuButtons/MetaInfo.tsx`). Fields
+ * are grouped by the panel's sections and are all optional except `interval`
+ * and `product`. Absent fields are omitted entirely rather than set to
+ * `undefined`, so the text formatter and `--json` output stay compact.
+ */
+export type ProfileMetaResult = {
+ type: 'profile-meta';
+
+ // ===== Recording =====
+ // Wall-clock start of the recording (ms since epoch). When
+ // `meta.profilingStartTime` is defined this is `startTime + profilingStartTime`
+ // (the actual moment recording began), otherwise the raw `meta.startTime`.
+ startTime?: number;
+ startTimeFormatted?: string; // ISO string of `startTime`
+ // Length of the recording in milliseconds, when derivable.
+ durationMs?: number;
+ endTime?: number; // raw `meta.endTime` (main process ended, ms since epoch)
+ endTimeFormatted?: string; // ISO string of `endTime`
+ interval: number; // sampling interval, in ms (or bytes for size profiles)
+ symbolicated?: boolean;
+ // Recording buffer, from `meta.configuration`. Capacity is converted from
+ // entries (8 bytes each) to bytes here.
+ bufferCapacityBytes?: number;
+ bufferDuration?: number; // buffer duration in seconds
+ features?: string[]; // enabled profiler features
+ threadsFilter?: string[]; // thread name filters
+
+ // ===== Application =====
+ product: string;
+ productAndVersion?: string; // e.g. "Firefox 130"
+ uptimeMs?: number; // time from process start to recording start
+ appBuildID?: string;
+ sourceURL?: string;
+ updateChannel?: string;
+ debug?: boolean;
+ arguments?: string;
+ extensions?: Array<{ name: string; id: string; baseURL?: string }>;
+
+ // ===== Platform =====
+ platform?: string; // formatted via `formatPlatform`
+ oscpu?: string; // raw `meta.oscpu`
+ abi?: string;
+ device?: string;
+ cpuName?: string;
+ physicalCPUs?: number;
+ logicalCPUs?: number;
+ mainMemoryBytes?: number;
+
+ // ===== Import / misc =====
+ importedFrom?: string;
+ fileName?: string;
+ fileSize?: number;
+ version?: number; // Gecko profile format version
+ preprocessedProfileVersion?: number;
+ sampleUnits?: SampleUnits;
+
+ // ===== Extra =====
+ // Free-form importer sections (`meta.extra`). `value` is passed through raw so
+ // `--json` stays machine-usable; `formatted` is the human-readable string
+ // produced with the entry's marker-schema format.
+ extra?: Array<{
+ label: string;
+ entries: Array<{ label: string; value: any; formatted: string }>;
+ }>;
};
diff --git a/src/selectors/per-thread/thread.tsx b/src/selectors/per-thread/thread.tsx
index 54966a55c7..f83961bbbe 100644
--- a/src/selectors/per-thread/thread.tsx
+++ b/src/selectors/per-thread/thread.tsx
@@ -27,7 +27,9 @@ import type {
JsTracerTable,
RawSamplesTable,
SamplesTable,
+ RawNativeAllocationsTable,
NativeAllocationsTable,
+ RawJsAllocationsTable,
JsAllocationsTable,
SamplesLikeTable,
Selector,
@@ -143,11 +145,25 @@ export function getBasicThreadSelectorsPerThread(
)
: null
);
- const getNativeAllocations: Selector = (
+ const getRawNativeAllocations: Selector = (
state
) => getRawThread(state).nativeAllocations;
- const getJsAllocations: Selector = (state) =>
+ const getRawJsAllocations: Selector = (state) =>
getRawThread(state).jsAllocations;
+ const getNativeAllocations: Selector =
+ createSelector(getRawNativeAllocations, (raw) =>
+ raw
+ ? ProfileData.computeNativeAllocationsTableFromRawNativeAllocationsTable(
+ raw
+ )
+ : undefined
+ );
+ const getJsAllocations: Selector =
+ createSelector(getRawJsAllocations, (raw) =>
+ raw
+ ? ProfileData.computeJsAllocationsTableFromRawJsAllocationsTable(raw)
+ : undefined
+ );
const getThreadRange: Selector = (state) =>
// This function is already memoized in profile-data.js, so we don't need to
// memoize it here with `createSelector`.
@@ -183,8 +199,7 @@ export function getBasicThreadSelectorsPerThread(
getRawThread,
getSamplesTable,
ProfileSelectors.getStackTable,
- (state: State) =>
- ProfileSelectors.getRawProfileSharedData(state).frameTable,
+ ProfileSelectors.getFrameTable,
ProfileSelectors.getFunctionsReservedFuncTable,
(state: State) =>
ProfileSelectors.getRawProfileSharedData(state).nativeSymbols,
@@ -195,6 +210,8 @@ export function getBasicThreadSelectorsPerThread(
getTracedValuesBuffer,
(state: State) =>
ProfileSelectors.getRawProfileSharedData(state).sourceLocationTable,
+ getJsAllocations,
+ getNativeAllocations,
ProfileData.createThreadFromDerivedTables
);
diff --git a/src/selectors/profile.ts b/src/selectors/profile.ts
index 896ca26b27..819daabe65 100644
--- a/src/selectors/profile.ts
+++ b/src/selectors/profile.ts
@@ -20,6 +20,7 @@ import {
computeInnerWindowIDToTabMap,
computeTabToThreadIndexesMap,
computeStackTableFromRawStackTable,
+ computeFrameTableFromRawFrameTable,
reserveFunctionsForCollapsedResources,
computeSamplesTableFromRawSamplesTable,
} from '../profile-logic/profile-data';
@@ -39,6 +40,7 @@ import type {
Profile,
RawProfileSharedData,
StackTable,
+ FrameTable,
CategoryList,
IndexIntoCategoryList,
RawThread,
@@ -275,9 +277,14 @@ export const getStringTable: Selector = createSelector(
(stringArray) => StringTable.withBackingArray(stringArray as string[])
);
+export const getFrameTable: Selector = createSelector(
+ (state: State) => getRawProfileSharedData(state).frameTable,
+ computeFrameTableFromRawFrameTable
+);
+
export const getStackTable: Selector = createSelector(
(state: State) => getRawProfileSharedData(state).stackTable,
- (state: State) => getRawProfileSharedData(state).frameTable,
+ getFrameTable,
getCategories,
getDefaultCategory,
computeStackTableFromRawStackTable
diff --git a/src/test/components/EmptyThreadIndicator.test.tsx b/src/test/components/EmptyThreadIndicator.test.tsx
index d835738784..ca5b77e044 100644
--- a/src/test/components/EmptyThreadIndicator.test.tsx
+++ b/src/test/components/EmptyThreadIndicator.test.tsx
@@ -29,7 +29,7 @@ describe('EmptyThreadIndicator', function () {
thread.processShutdownTime = 10;
thread.registerTime = 3;
thread.unregisterTime = 9;
- thread.samples.time = [5, 6, 7];
+ thread.samples.time = Float64Array.of(5, 6, 7);
// Make it really easy to generate the component's props.
function propsFromViewportRange(viewport: StartEndRange) {
diff --git a/src/test/components/TrackCustomMarker.test.tsx b/src/test/components/TrackCustomMarker.test.tsx
index 608433586d..65185e65f9 100644
--- a/src/test/components/TrackCustomMarker.test.tsx
+++ b/src/test/components/TrackCustomMarker.test.tsx
@@ -27,6 +27,7 @@ import {
getMouseEvent,
} from '../fixtures/utils';
import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile';
+import { getRawMarkerTableBuilderFromExisting } from '../../profile-logic/data-structures';
import {
autoMockElementSize,
setMockedElementSize,
@@ -79,15 +80,17 @@ function setup(
},
],
});
+ const markers = getRawMarkerTableBuilderFromExisting(thread.markers);
+ thread.markers = markers;
const addMarker = (startTime: number, first: number, second: number) => {
// @ts-expect-error - Invalid payload by our type system
- thread.markers.data.push({ type: 'Marker', first: first, second: second });
- thread.markers.name.push(markerStringIndex);
- thread.markers.startTime.push(startTime);
- thread.markers.endTime.push(startTime + 1);
- thread.markers.phase.push(1);
- thread.markers.category.push(4);
- thread.markers.length++;
+ markers.data.push({ type: 'Marker', first: first, second: second });
+ markers.name.push(markerStringIndex);
+ markers.startTime.push(startTime);
+ markers.endTime.push(startTime + 1);
+ markers.phase.push(1);
+ markers.category.push(4);
+ markers.length++;
};
values.forEach((value, index) => {
diff --git a/src/test/fixtures/profile-summary.ts b/src/test/fixtures/profile-summary.ts
new file mode 100644
index 0000000000..0a8d67da5e
--- /dev/null
+++ b/src/test/fixtures/profile-summary.ts
@@ -0,0 +1,478 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import type {
+ Profile,
+ RawThread,
+ IndexIntoStackTable,
+ RawStackTable,
+ RawFrameTable,
+ FuncTable,
+} from 'firefox-profiler/types';
+
+/**
+ * Walks a raw profile and asserts a set of structural invariants. Throws
+ * on the first violation.
+ *
+ * This catches "silent emptying" or "dangling reference" regressions in
+ * importers: e.g. samples pointing at stacks that don't exist, frames
+ * referring to funcs outside the funcTable, marker names referring to
+ * string indices that don't exist.
+ */
+export function assertProfileIntegrity(profile: Profile): void {
+ const { shared, threads, meta } = profile;
+ const {
+ stackTable,
+ frameTable,
+ funcTable,
+ resourceTable,
+ nativeSymbols,
+ stringArray,
+ } = shared;
+ const stringCount = stringArray.length;
+ const numCategories = meta.categories ? meta.categories.length : 0;
+
+ for (let s = 0; s < stackTable.length; s++) {
+ const frame = stackTable.frame[s];
+ if (!Number.isInteger(frame) || frame < 0 || frame >= frameTable.length) {
+ throw new Error(
+ `stackTable.frame[${s}] = ${frame} is not a valid integer index in [0, ${frameTable.length})`
+ );
+ }
+ const offset = stackTable.prefixOffset[s];
+ if (!Number.isInteger(offset) || offset < 0 || offset > s) {
+ throw new Error(
+ `stackTable.prefixOffset[${s}] = ${offset} is invalid (must be an integer in [0, ${s}])`
+ );
+ }
+ }
+
+ for (let f = 0; f < frameTable.length; f++) {
+ const func = frameTable.func[f];
+ if (!Number.isInteger(func) || func < 0 || func >= funcTable.length) {
+ throw new Error(
+ `frameTable.func[${f}] = ${func} is not a valid integer index in [0, ${funcTable.length})`
+ );
+ }
+ const ns = frameTable.nativeSymbol[f];
+ if (
+ ns !== null &&
+ (!Number.isInteger(ns) || ns < 0 || ns >= nativeSymbols.length)
+ ) {
+ throw new Error(
+ `frameTable.nativeSymbol[${f}] = ${ns} is not a valid integer index in [0, ${nativeSymbols.length})`
+ );
+ }
+ const cat = frameTable.category[f];
+ if (
+ cat !== null &&
+ (!Number.isInteger(cat) || cat < 0 || cat >= numCategories)
+ ) {
+ throw new Error(
+ `frameTable.category[${f}] = ${cat} is not a valid integer index in [0, ${numCategories})`
+ );
+ }
+ }
+
+ for (let fn = 0; fn < funcTable.length; fn++) {
+ const name = funcTable.name[fn];
+ if (!Number.isInteger(name) || name < 0 || name >= stringCount) {
+ throw new Error(
+ `funcTable.name[${fn}] = ${name} is not a valid integer index in [0, ${stringCount})`
+ );
+ }
+ const res = funcTable.resource[fn];
+ if (
+ !Number.isInteger(res) ||
+ (res !== -1 && (res < 0 || res >= resourceTable.length))
+ ) {
+ throw new Error(
+ `funcTable.resource[${fn}] = ${res} is not a valid integer index in [0, ${resourceTable.length}) or -1`
+ );
+ }
+ }
+
+ for (let n = 0; n < nativeSymbols.length; n++) {
+ const name = nativeSymbols.name[n];
+ if (!Number.isInteger(name) || name < 0 || name >= stringCount) {
+ throw new Error(
+ `nativeSymbols.name[${n}] = ${name} is not a valid integer index in [0, ${stringCount})`
+ );
+ }
+ }
+
+ const foundTids = new Set();
+ for (const thread of threads) {
+ const { tid, samples, markers, nativeAllocations, jsAllocations } = thread;
+ if (tid === undefined) {
+ throw new Error(`Thread ${thread.name} has undefined tid`);
+ }
+ if (foundTids.has(tid)) {
+ throw new Error(`Duplicate tid ${tid}`);
+ }
+ foundTids.add(tid);
+
+ checkStackRefs(
+ thread.name,
+ 'samples',
+ samples.stack,
+ samples.length,
+ stackTable.length
+ );
+
+ if (nativeAllocations) {
+ checkStackRefs(
+ thread.name,
+ 'nativeAllocations',
+ nativeAllocations.stack,
+ nativeAllocations.length,
+ stackTable.length
+ );
+ }
+ if (jsAllocations) {
+ checkStackRefs(
+ thread.name,
+ 'jsAllocations',
+ jsAllocations.stack,
+ jsAllocations.length,
+ stackTable.length
+ );
+ }
+
+ for (let i = 0; i < markers.length; i++) {
+ const name = markers.name[i];
+ if (!Number.isInteger(name) || name < 0 || name >= stringCount) {
+ throw new Error(
+ `thread ${thread.name} markers.name[${i}] = ${name} is not a valid integer index in [0, ${stringCount})`
+ );
+ }
+ const cat = markers.category[i];
+ if (!Number.isInteger(cat) || cat < 0 || cat >= numCategories) {
+ throw new Error(
+ `thread ${thread.name} markers.category[${i}] = ${cat} is not a valid integer index in [0, ${numCategories})`
+ );
+ }
+ }
+ }
+}
+
+function checkStackRefs(
+ threadName: string,
+ field: string,
+ stacks: Array,
+ length: number,
+ stackTableLength: number
+): void {
+ for (let i = 0; i < length; i++) {
+ const s = stacks[i];
+ if (
+ s !== null &&
+ (!Number.isInteger(s) || s < 0 || s >= stackTableLength)
+ ) {
+ throw new Error(
+ `thread ${threadName} ${field}.stack[${i}] = ${s} is not a valid integer index in [0, ${stackTableLength})`
+ );
+ }
+ }
+}
+
+type ThreadSummary = {
+ name: string;
+ pid: string | number;
+ tid: string | number;
+ isMainThread: boolean;
+ sampleCount: number;
+ sampleWeightTotal: number | null;
+ markerCount: number;
+ markerNamesTop: string[];
+ jsAllocationCount: number;
+ nativeAllocationCount: number;
+ nativeAllocationWeightTotal: number | null;
+ weightType: string;
+};
+
+export type ProfileSummary = {
+ meta: {
+ product: string;
+ importedFrom: string | undefined;
+ interval: number;
+ version: number;
+ preprocessedProfileVersion: number;
+ symbolicated: boolean | undefined;
+ categoryNames: string[];
+ markerSchemaNames: string[];
+ };
+ sharedCounts: {
+ funcs: number;
+ frames: number;
+ stacks: number;
+ resources: number;
+ nativeSymbols: number;
+ strings: number;
+ libs: number;
+ };
+ threads: ThreadSummary[];
+};
+
+/**
+ * Produces a small, human-reviewable summary of a Profile. Snapshot this
+ * instead of the full profile: it captures the "shape" of the imported
+ * data (thread names, counts, categories, weight totals) without
+ * including the tens of thousands of array entries that make full-profile
+ * snapshots unreviewable.
+ */
+export function summarizeProfile(profile: Profile): ProfileSummary {
+ const { meta, shared, libs, threads } = profile;
+ const stringArray = shared.stringArray;
+ return {
+ meta: {
+ product: meta.product,
+ importedFrom: meta.importedFrom,
+ interval: meta.interval,
+ version: meta.version,
+ preprocessedProfileVersion: meta.preprocessedProfileVersion,
+ symbolicated: meta.symbolicated,
+ categoryNames: (meta.categories ?? []).map((c) => c.name),
+ markerSchemaNames: (meta.markerSchema ?? []).map((s) => s.name),
+ },
+ sharedCounts: {
+ funcs: shared.funcTable.length,
+ frames: shared.frameTable.length,
+ stacks: shared.stackTable.length,
+ resources: shared.resourceTable.length,
+ nativeSymbols: shared.nativeSymbols.length,
+ strings: stringArray.length,
+ libs: libs.length,
+ },
+ threads: threads.map((t) => summarizeThread(t, stringArray)),
+ };
+}
+
+function summarizeThread(
+ thread: RawThread,
+ stringArray: string[]
+): ThreadSummary {
+ const markerNameCounts = new Map();
+ for (let i = 0; i < thread.markers.length; i++) {
+ const name = stringArray[thread.markers.name[i]];
+ markerNameCounts.set(name, (markerNameCounts.get(name) ?? 0) + 1);
+ }
+ const markerNamesTop = Array.from(markerNameCounts.entries())
+ .sort((a, b) => b[1] - a[1])
+ .slice(0, 10)
+ .map(([n, c]) => `${n} (${c})`);
+
+ const sampleWeightTotal = sumWeight(
+ thread.samples.weight,
+ thread.samples.length
+ );
+
+ const nativeAllocs = thread.nativeAllocations;
+ const nativeAllocationCount = nativeAllocs ? nativeAllocs.length : 0;
+ const nativeAllocationWeightTotal = nativeAllocs
+ ? sumWeight(nativeAllocs.weight, nativeAllocs.length)
+ : null;
+
+ return {
+ name: thread.name,
+ pid: thread.pid,
+ tid: thread.tid,
+ isMainThread: thread.isMainThread,
+ sampleCount: thread.samples.length,
+ sampleWeightTotal,
+ markerCount: thread.markers.length,
+ markerNamesTop,
+ jsAllocationCount: thread.jsAllocations ? thread.jsAllocations.length : 0,
+ nativeAllocationCount,
+ nativeAllocationWeightTotal,
+ weightType: thread.samples.weightType,
+ };
+}
+
+function sumWeight(
+ weight: number[] | null | undefined,
+ length: number
+): number | null {
+ if (!weight) {
+ return null;
+ }
+ let total = 0;
+ for (let i = 0; i < length; i++) {
+ total += weight[i];
+ }
+ return total;
+}
+
+type SampleLikeSource = 'samples' | 'nativeAllocations' | 'jsAllocations';
+
+/**
+ * Returns a snapshot of the top-K unique stacks in a thread, ranked by
+ * their weight (or count if unweighted).
+ *
+ * If `source` is omitted, the first non-empty of samples /
+ * nativeAllocations / jsAllocations is used. This makes the helper work
+ * uniformly across importers that use different weight sources (e.g.
+ * dhat uses nativeAllocations).
+ *
+ * The output looks like:
+ *
+ * [
+ * '1024 (12x) main -> foo -> bar',
+ * '512 (6x) main -> baz',
+ * ...
+ * ]
+ *
+ * where the leading number is the summed weight for that stack and
+ * `(Nx)` is the number of hits. This is compact, human-reviewable, and
+ * catches semantic regressions such as: empty stacks (dhat bug), wrong
+ * function name attribution, weight-total regressions, and category
+ * leakage. It is intentionally insensitive to internal encoding details
+ * like table ordering.
+ */
+export function topStacksByWeight(
+ profile: Profile,
+ threadIndex: number,
+ topK: number = 5,
+ source?: SampleLikeSource
+): string[] {
+ const thread = profile.threads[threadIndex];
+ const { stackTable, frameTable, funcTable, stringArray } = profile.shared;
+
+ const sampleLike = source
+ ? getSampleLike(thread, source)
+ : pickNonEmptySampleLike(thread);
+ if (!sampleLike) {
+ return [];
+ }
+
+ const totals = new Map<
+ IndexIntoStackTable | null,
+ { weight: number; count: number }
+ >();
+ for (let i = 0; i < sampleLike.length; i++) {
+ const s = sampleLike.stack[i];
+ const w = sampleLike.weight ? sampleLike.weight[i] : 1;
+ const cur = totals.get(s);
+ if (cur) {
+ cur.weight += w;
+ cur.count += 1;
+ } else {
+ totals.set(s, { weight: w, count: 1 });
+ }
+ }
+
+ const sorted = Array.from(totals.entries()).sort(
+ (a, b) => Math.abs(b[1].weight) - Math.abs(a[1].weight)
+ );
+
+ return sorted.slice(0, topK).map(([stack, { weight, count }]) => {
+ const path = renderStackPath(
+ stack,
+ stackTable,
+ frameTable,
+ funcTable,
+ stringArray
+ );
+ return `${weight} (${count}x) ${path}`;
+ });
+}
+
+function pickNonEmptySampleLike(thread: RawThread) {
+ const samples = getSampleLike(thread, 'samples');
+ if (samples && samples.length > 0) {
+ return samples;
+ }
+ const native = getSampleLike(thread, 'nativeAllocations');
+ if (native && native.length > 0) {
+ return native;
+ }
+ const js = getSampleLike(thread, 'jsAllocations');
+ if (js && js.length > 0) {
+ return js;
+ }
+ return samples;
+}
+
+function getSampleLike(
+ thread: RawThread,
+ source: SampleLikeSource
+): {
+ stack: Array;
+ weight: number[] | null;
+ length: number;
+} | null {
+ if (source === 'samples') {
+ return {
+ stack: thread.samples.stack,
+ weight: thread.samples.weight,
+ length: thread.samples.length,
+ };
+ }
+ if (source === 'nativeAllocations' && thread.nativeAllocations) {
+ return {
+ stack: thread.nativeAllocations.stack,
+ weight: thread.nativeAllocations.weight,
+ length: thread.nativeAllocations.length,
+ };
+ }
+ if (source === 'jsAllocations' && thread.jsAllocations) {
+ return {
+ stack: thread.jsAllocations.stack,
+ weight: thread.jsAllocations.weight,
+ length: thread.jsAllocations.length,
+ };
+ }
+ return null;
+}
+
+/**
+ * Convenience wrapper that bundles a profile "shape" summary plus a
+ * top-K stack listing per thread into a single object, suitable for
+ * `toMatchSnapshot()`. This is the standard snapshot payload for
+ * importer tests: it's small, human-reviewable, and gives good coverage
+ * against the common regression classes (silent emptying, wrong
+ * attribution, metadata drift, sample/marker loss).
+ */
+export function profileImportSnapshot(
+ profile: Profile,
+ topK: number = 5
+): {
+ summary: ProfileSummary;
+ topStacksPerThread: Array<{
+ thread: string;
+ tid: string | number;
+ stacks: string[];
+ }>;
+} {
+ return {
+ summary: summarizeProfile(profile),
+ topStacksPerThread: profile.threads.map((t, i) => ({
+ thread: t.name,
+ tid: t.tid,
+ stacks: topStacksByWeight(profile, i, topK),
+ })),
+ };
+}
+
+function renderStackPath(
+ stack: IndexIntoStackTable | null,
+ stackTable: RawStackTable,
+ frameTable: RawFrameTable,
+ funcTable: FuncTable,
+ stringArray: string[]
+): string {
+ if (stack === null) {
+ return '(null stack)';
+ }
+ const names: string[] = [];
+ let s: IndexIntoStackTable | null = stack;
+ while (s !== null) {
+ const frame = stackTable.frame[s];
+ const func = frameTable.func[frame];
+ names.push(stringArray[funcTable.name[func]]);
+ const offset: number = stackTable.prefixOffset[s];
+ s = offset === 0 ? null : s - offset;
+ }
+ return names.reverse().join(' -> ');
+}
diff --git a/src/test/fixtures/profiles/call-nodes.ts b/src/test/fixtures/profiles/call-nodes.ts
index 0ffed2dd52..8692daf1ab 100644
--- a/src/test/fixtures/profiles/call-nodes.ts
+++ b/src/test/fixtures/profiles/call-nodes.ts
@@ -1,7 +1,7 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import type { FuncTable, FrameTable, Profile } from 'firefox-profiler/types';
+import type { FuncTable, RawFrameTable, Profile } from 'firefox-profiler/types';
import {
getEmptyThread,
@@ -74,7 +74,7 @@ export default function getProfile(): Profile {
funcFFrame,
] = frameFuncs.map((_, i) => i);
- const frameTable: FrameTable = {
+ const frameTable: RawFrameTable = {
func: frameFuncs.map((stringIndex) => funcTable.name.indexOf(stringIndex)),
address: Array(frameFuncs.length).fill(-1),
inlineDepth: Array(frameFuncs.length).fill(0),
diff --git a/src/test/fixtures/profiles/processed-profile.ts b/src/test/fixtures/profiles/processed-profile.ts
index fea127bc5c..dc886ee205 100644
--- a/src/test/fixtures/profiles/processed-profile.ts
+++ b/src/test/fixtures/profiles/processed-profile.ts
@@ -5,11 +5,20 @@ import {
getEmptyProfile,
getEmptyThread,
getEmptyJsTracerTable,
- getEmptyJsAllocationsTable,
- getEmptyUnbalancedNativeAllocationsTable,
- getEmptyBalancedNativeAllocationsTable,
+ getEmptyRawJsAllocationsTable,
+ getEmptyRawUnbalancedNativeAllocationsTable,
+ getEmptyRawBalancedNativeAllocationsTable,
getRawStackTableBuilderWithExistingContents,
+ finishRawBalancedNativeAllocationsTableBuilder,
+ finishRawFrameTableBuilder,
+ finishRawJsAllocationsTableBuilder,
+ finishRawSamplesTableBuilder,
+ finishRawUnbalancedNativeAllocationsTableBuilder,
+ getRawSamplesTableBuilderFromExisting,
+ getRawMarkerTableBuilderFromExisting,
finishRawStackTableBuilder,
+ getRawFrameTableBuilderWithExistingContents,
+ getRawSamplesTableBuilderWithEventDelay,
} from '../../../profile-logic/data-structures';
import { mergeProfilesForDiffing } from '../../../profile-logic/merge-compare';
import { computeReferenceCPUDeltaPerMs } from '../../../profile-logic/cpu';
@@ -119,7 +128,8 @@ export function addRawMarkersToThread(
markers: TestDefinedRawMarker[]
) {
const stringTable = StringTable.withBackingArray(shared.stringArray);
- const markersTable = thread.markers;
+ const markersTable = getRawMarkerTableBuilderFromExisting(thread.markers);
+ thread.markers = markersTable;
for (const { name, startTime, endTime, phase, category, data } of markers) {
markersTable.name.push(
@@ -172,7 +182,8 @@ export function addMarkersToThreadWithCorrespondingSamples(
markers: TestDefinedMarker[]
) {
const stringTable = StringTable.withBackingArray(shared.stringArray);
- const markersTable = thread.markers;
+ const markersTable = getRawMarkerTableBuilderFromExisting(thread.markers);
+ thread.markers = markersTable;
const allTimes = new Set();
markers.forEach((tuple) => {
@@ -209,7 +220,7 @@ export function addMarkersToThreadWithCorrespondingSamples(
// control the initial range. Because of that we need to add samples so that
// the range includes these markers. Note that when a thread has no sample,
// then the markers are used to compute the initial range.
- const { samples } = thread;
+ const samples = getRawSamplesTableBuilderFromExisting(thread.samples);
if (samples.length) {
const firstMarkerTime = Math.min(...allTimes);
const lastMarkerTime = Math.max(...allTimes);
@@ -255,6 +266,7 @@ export function addMarkersToThreadWithCorrespondingSamples(
samples.length++;
}
}
+ thread.samples = finishRawSamplesTableBuilder(samples);
}
export function getThreadWithMarkers(
@@ -876,7 +888,7 @@ function _buildThreadFromTextOnlyStacks(
): RawThread {
const thread = getEmptyThread();
- const { samples } = thread;
+ const samples = getRawSamplesTableBuilderWithEventDelay();
const stringTable = globalDataCollector.getStringTable();
const frameTable = globalDataCollector.getFrameTable();
@@ -1018,6 +1030,8 @@ function _buildThreadFromTextOnlyStacks(
samples.time = sampleTimes;
}
+ thread.samples = finishRawSamplesTableBuilder(samples);
+
return thread;
}
@@ -1501,13 +1515,13 @@ export function getCounterForThread(
pid: thread.pid,
mainThreadIndex,
samples: {
- time: sampleTimes.slice(),
+ time: Array.from(sampleTimes),
// Create some arbitrary (positive integer) values for the number.
number: config.hasCountNumber
- ? sampleTimes.map((_, i) => Math.floor(50 * Math.sin(i) + 50))
+ ? Array.from(sampleTimes, (_, i) => Math.floor(50 * Math.sin(i) + 50))
: undefined,
// Create some arbitrary values for the count.
- count: sampleTimes.map((_, i) => Math.sin(i)),
+ count: Array.from(sampleTimes, (_, i) => Math.sin(i)),
length: thread.samples.length,
},
display: deriveCounterDisplay(category, name),
@@ -1522,7 +1536,7 @@ export function getCounterForThreadWithSamples(
thread: RawThread,
mainThreadIndex: ThreadIndex,
samples: {
- time?: number[];
+ time?: number[] | Float64Array;
number?: number[];
count?: number[];
length: number;
@@ -1628,9 +1642,8 @@ export function getProfileWithJsAllocations() {
I[lib:libI.so]
`);
- // Now add a JsAllocationsTable.
- const jsAllocations = getEmptyJsAllocationsTable();
- profile.threads[0].jsAllocations = jsAllocations;
+ // Now add a RawJsAllocationsTable.
+ const jsAllocations = getEmptyRawJsAllocationsTable();
// The stack table is built sequentially, so we can assume that the stack indexes
// match the func indexes.
@@ -1657,6 +1670,9 @@ export function getProfileWithJsAllocations() {
jsAllocations.length++;
}
+ profile.threads[0].jsAllocations =
+ finishRawJsAllocationsTableBuilder(jsAllocations);
+
return { profile, funcNamesDict, funcNames };
}
@@ -1708,9 +1724,8 @@ export function getProfileWithUnbalancedNativeAllocations() {
`
);
- // Now add a NativeAllocationsTable.
- const nativeAllocations = getEmptyUnbalancedNativeAllocationsTable();
- profile.threads[0].nativeAllocations = nativeAllocations;
+ // Now add a RawNativeAllocationsTable.
+ const nativeAllocations = getEmptyRawUnbalancedNativeAllocationsTable();
// The stack table is built sequentially, so we can assume that the stack indexes
// match the func indexes.
@@ -1738,6 +1753,9 @@ export function getProfileWithUnbalancedNativeAllocations() {
nativeAllocations.length++;
}
+ profile.threads[0].nativeAllocations =
+ finishRawUnbalancedNativeAllocationsTableBuilder(nativeAllocations);
+
return { profile, funcNamesDict };
}
@@ -1776,10 +1794,9 @@ export function getProfileWithBalancedNativeAllocations() {
`
);
- // Now add a NativeAllocationsTable.
- const nativeAllocations = getEmptyBalancedNativeAllocationsTable();
+ // Now add a RawNativeAllocationsTable.
+ const nativeAllocations = getEmptyRawBalancedNativeAllocationsTable();
const [thread] = profile.threads;
- thread.nativeAllocations = nativeAllocations;
const threadId = thread.tid;
if (typeof threadId !== 'number') {
throw new Error(
@@ -1825,6 +1842,9 @@ export function getProfileWithBalancedNativeAllocations() {
nativeAllocations.length++;
}
+ thread.nativeAllocations =
+ finishRawBalancedNativeAllocationsTableBuilder(nativeAllocations);
+
return { profile, funcNamesDict };
}
@@ -2013,7 +2033,7 @@ export function addInnerWindowIdToStacks(
callNodesToDupe?: CallNodePath[]
) {
const { stackTable, frameTable } = shared;
- const { samples } = thread;
+ const samples = getRawSamplesTableBuilderFromExisting(thread.samples);
const usedInnerWindowIDsSet = new Set();
for (const { innerWindowID, callNodes } of listOfOperations) {
@@ -2043,30 +2063,38 @@ export function addInnerWindowIdToStacks(
const stackTableBuilder =
getRawStackTableBuilderWithExistingContents(stackTable);
+ const frameTableBuilder =
+ getRawFrameTableBuilderWithExistingContents(frameTable);
for (const callNode of callNodesToDupe) {
const stackIndex = getStackIndexForCallNodePath(shared, callNode);
const foundFrameIndex = stackTable.frame[stackIndex];
// The found one comes from the first tab.
- frameTable.innerWindowID[foundFrameIndex] =
+ frameTableBuilder.innerWindowID[foundFrameIndex] =
listOfOperations[0].innerWindowID;
// Clone this frame
- const newFrameIndex = frameTable.length++;
- frameTable.address.push(frameTable.address[foundFrameIndex]);
- frameTable.inlineDepth.push(frameTable.inlineDepth[foundFrameIndex]);
- frameTable.category.push(frameTable.category[foundFrameIndex]);
- frameTable.subcategory.push(frameTable.subcategory[foundFrameIndex]);
- frameTable.func.push(frameTable.func[foundFrameIndex]);
- frameTable.nativeSymbol.push(frameTable.nativeSymbol[foundFrameIndex]);
- frameTable.line.push(frameTable.line[foundFrameIndex]);
- frameTable.column.push(frameTable.column[foundFrameIndex]);
- frameTable.originalLocation.push(
+ const newFrameIndex = frameTableBuilder.length++;
+ frameTableBuilder.address.push(frameTable.address[foundFrameIndex]);
+ frameTableBuilder.inlineDepth.push(
+ frameTable.inlineDepth[foundFrameIndex]
+ );
+ frameTableBuilder.category.push(frameTable.category[foundFrameIndex]);
+ frameTableBuilder.subcategory.push(
+ frameTable.subcategory[foundFrameIndex]
+ );
+ frameTableBuilder.func.push(frameTable.func[foundFrameIndex]);
+ frameTableBuilder.nativeSymbol.push(
+ frameTable.nativeSymbol[foundFrameIndex]
+ );
+ frameTableBuilder.line.push(frameTable.line[foundFrameIndex]);
+ frameTableBuilder.column.push(frameTable.column[foundFrameIndex]);
+ frameTableBuilder.originalLocation.push(
frameTable.originalLocation[foundFrameIndex]
);
// And that one comes from the second tab.
- frameTable.innerWindowID.push(listOfOperations[1].innerWindowID);
+ frameTableBuilder.innerWindowID.push(listOfOperations[1].innerWindowID);
// Clone the stack
const newStackIndex = stackTableBuilder.length++;
@@ -2079,6 +2107,7 @@ export function addInnerWindowIdToStacks(
}
shared.stackTable = finishRawStackTableBuilder(stackTableBuilder);
+ shared.frameTable = finishRawFrameTableBuilder(frameTableBuilder);
const sampleTimes = ensureExists(samples.time);
for (let sampleIndex = samples.length; sampleIndex >= 0; sampleIndex--) {
@@ -2112,6 +2141,8 @@ export function addInnerWindowIdToStacks(
}
}
+ thread.samples = finishRawSamplesTableBuilder(samples);
+
if (usedInnerWindowIDsSet.size !== 0) {
thread.usedInnerWindowIDs = Array.from(usedInnerWindowIDsSet);
}
diff --git a/src/test/fixtures/profiles/tracks.ts b/src/test/fixtures/profiles/tracks.ts
index f906fc5ad5..81fc8dfa98 100644
--- a/src/test/fixtures/profiles/tracks.ts
+++ b/src/test/fixtures/profiles/tracks.ts
@@ -13,6 +13,7 @@ import { oneLine } from 'common-tags';
import type { Profile, State, Pid } from 'firefox-profiler/types';
import { StringTable } from '../../../utils/string-table';
+import { getRawMarkerTableBuilderFromExisting } from '../../../profile-logic/data-structures';
import { INSTANT } from 'firefox-profiler/app-logic/constants';
/**
@@ -141,19 +142,21 @@ export function getProfileWithNiceTracks(): Profile {
thread2.tid = 22;
// Add a refresh driver tick so that this thread will not be idle.
- thread2.markers.data.push({
+ const thread2Markers = getRawMarkerTableBuilderFromExisting(thread2.markers);
+ thread2.markers = thread2Markers;
+ thread2Markers.data.push({
type: 'tracing',
category: 'Paint',
});
- thread2.markers.category.push(0);
+ thread2Markers.category.push(0);
const thread2StringTable = StringTable.withBackingArray(shared.stringArray);
- thread2.markers.name.push(
+ thread2Markers.name.push(
thread2StringTable.indexForString('RefreshDriverTick')
);
- thread2.markers.startTime.push(0);
- thread2.markers.endTime.push(null);
- thread2.markers.phase.push(INSTANT);
- thread2.markers.length++;
+ thread2Markers.startTime.push(0);
+ thread2Markers.endTime.push(null);
+ thread2Markers.phase.push(INSTANT);
+ thread2Markers.length++;
thread3.name = 'DOM Worker';
thread3.pid = '222';
diff --git a/src/test/fixtures/utils.ts b/src/test/fixtures/utils.ts
index d91e76e8fa..b57a898e8b 100644
--- a/src/test/fixtures/utils.ts
+++ b/src/test/fixtures/utils.ts
@@ -18,7 +18,10 @@ import {
getOriginAnnotationForFunc,
createThreadFromDerivedTables,
computeStackTableFromRawStackTable,
+ computeFrameTableFromRawFrameTable,
computeSamplesTableFromRawSamplesTable,
+ computeJsAllocationsTableFromRawJsAllocationsTable,
+ computeNativeAllocationsTableFromRawNativeAllocationsTable,
} from 'firefox-profiler/profile-logic/profile-data';
import { getProfileWithDicts } from './profiles/processed-profile';
import { StringTable } from '../../utils/string-table';
@@ -146,9 +149,10 @@ export function computeThreadFromRawThread(
defaultCategory: IndexIntoCategoryList
): Thread {
const stringTable = StringTable.withBackingArray(shared.stringArray);
+ const frameTable = computeFrameTableFromRawFrameTable(shared.frameTable);
const stackTable = computeStackTableFromRawStackTable(
shared.stackTable,
- shared.frameTable,
+ frameTable,
categories,
defaultCategory
);
@@ -162,18 +166,30 @@ export function computeThreadFromRawThread(
const tracedValuesBuffer = rawThread.tracedValuesBuffer
? base64StringToBytes(rawThread.tracedValuesBuffer)
: undefined;
+ const jsAllocations = rawThread.jsAllocations
+ ? computeJsAllocationsTableFromRawJsAllocationsTable(
+ rawThread.jsAllocations
+ )
+ : undefined;
+ const nativeAllocations = rawThread.nativeAllocations
+ ? computeNativeAllocationsTableFromRawNativeAllocationsTable(
+ rawThread.nativeAllocations
+ )
+ : undefined;
return createThreadFromDerivedTables(
rawThread,
samples,
stackTable,
- shared.frameTable,
+ frameTable,
shared.funcTable,
shared.nativeSymbols,
shared.resourceTable,
stringTable,
shared.sources,
tracedValuesBuffer,
- shared.sourceLocationTable
+ shared.sourceLocationTable,
+ jsAllocations,
+ nativeAllocations
);
}
diff --git a/src/test/integration/profiler-edit/__snapshots__/profiler-edit.test.ts.snap b/src/test/integration/profiler-edit/__snapshots__/profiler-edit.test.ts.snap
index d186387a95..5410c2b927 100644
--- a/src/test/integration/profiler-edit/__snapshots__/profiler-edit.test.ts.snap
+++ b/src/test/integration/profiler-edit/__snapshots__/profiler-edit.test.ts.snap
@@ -87,7 +87,7 @@ Object {
"markerSchema": Array [],
"oscpu": "macOS 14.6.1",
"pausedRanges": Array [],
- "preprocessedProfileVersion": 66,
+ "preprocessedProfileVersion": 68,
"processType": 0,
"product": "a.out",
"sampleUnits": Object {
@@ -1452,7 +1452,7 @@ Object {
"markerSchema": Array [],
"oscpu": "macOS 14.6.1",
"pausedRanges": Array [],
- "preprocessedProfileVersion": 66,
+ "preprocessedProfileVersion": 68,
"processType": 0,
"product": "a.out",
"sampleUnits": Object {
@@ -2817,7 +2817,7 @@ Object {
"markerSchema": Array [],
"oscpu": "macOS 14.6.1",
"pausedRanges": Array [],
- "preprocessedProfileVersion": 66,
+ "preprocessedProfileVersion": 68,
"processType": 0,
"product": "a.out",
"sampleUnits": Object {
@@ -4182,7 +4182,7 @@ Object {
"markerSchema": Array [],
"oscpu": "macOS 14.6.1",
"pausedRanges": Array [],
- "preprocessedProfileVersion": 66,
+ "preprocessedProfileVersion": 68,
"processType": 0,
"product": "a.out",
"sampleUnits": Object {
diff --git a/src/test/store/__snapshots__/profile-view.test.ts.snap b/src/test/store/__snapshots__/profile-view.test.ts.snap
index 0479910d2b..409c516cca 100644
--- a/src/test/store/__snapshots__/profile-view.test.ts.snap
+++ b/src/test/store/__snapshots__/profile-view.test.ts.snap
@@ -423,7 +423,7 @@ Object {
"oscpu": "",
"physicalCPUs": 0,
"platform": "",
- "preprocessedProfileVersion": 66,
+ "preprocessedProfileVersion": 68,
"processType": 0,
"product": "Firefox",
"sourceURL": "",
@@ -431,7 +431,7 @@ Object {
"startTime": 0,
"symbolicated": true,
"toolkit": "",
- "version": 34,
+ "version": 35,
},
"pages": Array [
Object {
@@ -443,7 +443,7 @@ Object {
],
"shared": Object {
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -476,7 +476,7 @@ Object {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -487,7 +487,7 @@ Object {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -912,6 +912,7 @@ Object {
55,
56,
],
+ "timeDeltas": undefined,
"weight": null,
"weightType": "samples",
},
@@ -1055,7 +1056,8 @@ Object {
"eventDelay": Array [],
"length": 0,
"stack": Array [],
- "time": Array [],
+ "time": Float64Array [],
+ "timeDeltas": undefined,
"weight": null,
"weightType": "samples",
},
@@ -1265,6 +1267,7 @@ Array [
55,
56,
],
+ "timeDeltas": undefined,
"weight": null,
"weightType": "samples",
},
@@ -1408,7 +1411,8 @@ Array [
"eventDelay": Array [],
"length": 0,
"stack": Array [],
- "time": Array [],
+ "time": Float64Array [],
+ "timeDeltas": undefined,
"weight": null,
"weightType": "samples",
},
@@ -2396,7 +2400,7 @@ CallTree {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
4,
5,
],
@@ -2410,7 +2414,7 @@ CallTree {
"_thread": Object {
"eTLD+1": undefined,
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -2443,7 +2447,7 @@ CallTree {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -2454,7 +2458,7 @@ CallTree {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -2684,7 +2688,7 @@ CallTree {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
3,
4,
5,
@@ -2798,7 +2802,7 @@ exports[`snapshots of selectors/profile matches the last stored run of selectedT
Object {
"eTLD+1": undefined,
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -2831,7 +2835,7 @@ Object {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -2842,7 +2846,7 @@ Object {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -3072,7 +3076,7 @@ Object {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
3,
4,
5,
@@ -3266,7 +3270,7 @@ exports[`snapshots of selectors/profile matches the last stored run of selectedT
Object {
"eTLD+1": undefined,
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -3299,7 +3303,7 @@ Object {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -3310,7 +3314,7 @@ Object {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -3530,7 +3534,7 @@ Object {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
4,
5,
],
@@ -3640,7 +3644,7 @@ exports[`snapshots of selectors/profile matches the last stored run of selectedT
Object {
"eTLD+1": undefined,
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -3673,7 +3677,7 @@ Object {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -3684,7 +3688,7 @@ Object {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -3914,7 +3918,7 @@ Object {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
3,
4,
5,
@@ -4026,7 +4030,7 @@ exports[`snapshots of selectors/profile matches the last stored run of selectedT
Object {
"eTLD+1": undefined,
"frameTable": Object {
- "address": Array [
+ "address": Int32Array [
-1,
-1,
-1,
@@ -4059,7 +4063,7 @@ Object {
null,
null,
],
- "func": Array [
+ "func": Int32Array [
0,
1,
2,
@@ -4070,7 +4074,7 @@ Object {
7,
8,
],
- "inlineDepth": Array [
+ "inlineDepth": Uint8Array [
0,
0,
0,
@@ -4300,7 +4304,7 @@ Object {
100,
100,
],
- "time": Array [
+ "time": Float64Array [
3,
4,
5,
diff --git a/src/test/store/profile-view.test.ts b/src/test/store/profile-view.test.ts
index aee023d0c8..127d1bca69 100644
--- a/src/test/store/profile-view.test.ts
+++ b/src/test/store/profile-view.test.ts
@@ -19,9 +19,10 @@ import {
getThreadWithMarkers,
} from '../fixtures/profiles/processed-profile';
import {
+ finishRawSamplesTableBuilder,
getEmptyThread,
getEmptyProfile,
- getEmptySamplesTableWithEventDelay,
+ getRawSamplesTableBuilderWithEventDelay,
} from '../../profile-logic/data-structures';
import { withAnalyticsMock } from '../fixtures/mocks/analytics';
import { getProfileWithNiceTracks } from '../fixtures/profiles/tracks';
@@ -53,11 +54,11 @@ import { checkBit } from '../../utils/bitset';
import type {
TrackReference,
Milliseconds,
- RawThread,
StartEndRange,
Marker,
MixedObject,
CallNodePath,
+ RawThread,
} from 'firefox-profiler/types';
describe('call node paths on implementation filter change', function () {
@@ -3848,7 +3849,7 @@ describe('getProcessedEventDelays', function () {
const profile = getEmptyProfile();
// Create event delay values.
- const samples = getEmptySamplesTableWithEventDelay();
+ const samples = getRawSamplesTableBuilderWithEventDelay();
if (eventDelay) {
samples.eventDelay = eventDelay;
} else {
@@ -3866,7 +3867,9 @@ describe('getProcessedEventDelays', function () {
.fill(0)
.map((_, i) => i);
samples.stack = Array(samples.length).fill(null);
- profile.threads.push(getEmptyThread({ samples }));
+ profile.threads.push(
+ getEmptyThread({ samples: finishRawSamplesTableBuilder(samples) })
+ );
const { dispatch, getState } = storeWithProfile(profile);
diff --git a/src/test/store/receive-profile.test.ts b/src/test/store/receive-profile.test.ts
index 5de663db0f..afc2309460 100644
--- a/src/test/store/receive-profile.test.ts
+++ b/src/test/store/receive-profile.test.ts
@@ -1611,7 +1611,6 @@ describe('actions/receive-profile', function () {
const expectedThreads = [
expect.objectContaining({
- ...profile1.threads[0],
pid: '0 from profile 1',
tid: '0 from profile 1',
isMainThread: true,
diff --git a/src/test/store/useful-tabs.test.ts b/src/test/store/useful-tabs.test.ts
index 2e770a2581..0d63df2759 100644
--- a/src/test/store/useful-tabs.test.ts
+++ b/src/test/store/useful-tabs.test.ts
@@ -13,7 +13,10 @@ import {
getMergedProfileFromTextSamples,
getProfileWithUnbalancedNativeAllocations,
} from '../fixtures/profiles/processed-profile';
-import { getEmptySamplesTableWithEventDelay } from '../../profile-logic/data-structures';
+import {
+ finishRawSamplesTableBuilder,
+ getRawSamplesTableBuilderWithEventDelay,
+} from '../../profile-logic/data-structures';
describe('getUsefulTabs', function () {
it('hides the network chart and JS tracer when no data is in the thread', function () {
@@ -79,7 +82,9 @@ describe('getUsefulTabs', function () {
it('shows sample related tabs even when there are only allocation samples in the profile', function () {
const { profile } = getProfileWithUnbalancedNativeAllocations();
for (const thread of profile.threads) {
- thread.samples = getEmptySamplesTableWithEventDelay();
+ thread.samples = finishRawSamplesTableBuilder(
+ getRawSamplesTableBuilderWithEventDelay()
+ );
}
const { getState } = storeWithProfile(profile);
expect(selectedThreadSelectors.getUsefulTabs(getState())).toEqual([
diff --git a/src/test/unit/__snapshots__/marker-schema.test.ts.snap b/src/test/unit/__snapshots__/marker-schema.test.ts.snap
index 77eb343601..9f60bce48e 100644
--- a/src/test/unit/__snapshots__/marker-schema.test.ts.snap
+++ b/src/test/unit/__snapshots__/marker-schema.test.ts.snap
@@ -15,6 +15,31 @@ Array [
,
"http://example.com",
],
+ Array [
+ "url",
+ "https://example.com/path?query=1",
+
+ example.com/path?query=1
+ ,
+ "https://example.com/path?query=1",
+ ],
+ Array [
+ "url",
+ "loaded https://example.com successfully",
+ "loaded https://example.com successfully",
+ "loaded https://example.com successfully",
+ ],
+ Array [
+ "url",
+ "https://example.com then some more text",
+ "https://example.com then some more text",
+ "https://example.com then some more text",
+ ],
Array [
"file-path",
"/Users/me/gecko",
diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap
index 713bff2592..309eadb92d 100644
--- a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap
+++ b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap
@@ -2,905651 +2,5554 @@
exports[`converting ART trace successfully imports a non-streaming ART trace 1`] = `
Object {
- "counters": Array [],
- "libs": Array [],
- "meta": Object {
- "CPUName": undefined,
- "abi": undefined,
- "appBuildID": undefined,
- "categories": Array [
- Object {
- "color": "transparent",
- "name": "Idle",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "grey",
- "name": "Other",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "lightblue",
- "name": "Blocked",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "yellow",
- "name": "Android",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "blue",
- "name": "Java",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "purple",
- "name": "Kotlin / KotlinX",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "orange",
- "name": "AndroidX",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "green",
- "name": "Mozilla",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "purple",
- "name": "Layout",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "yellow",
- "name": "JavaScript",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "orange",
- "name": "GC / CC",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "lightblue",
- "name": "Network",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "green",
- "name": "Graphics",
- "subcategories": Array [
- "Other",
- ],
- },
- Object {
- "color": "blue",
- "name": "DOM",
- "subcategories": Array [
- "Other",
- ],
- },
- ],
- "configuration": undefined,
- "debug": false,
- "device": undefined,
- "extensions": Object {
- "baseURL": Array [],
- "id": Array [],
- "length": 0,
- "name": Array [],
- },
- "interval": 5.5,
- "logicalCPUs": undefined,
- "markerSchema": Array [
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-memory",
- ],
- "fields": Array [],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "GCMajor",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-memory",
- ],
- "fields": Array [],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "GCMinor",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-memory",
- ],
- "fields": Array [],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "GCSlice",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-memory",
- ],
- "fields": Array [],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "CC",
- "tableLabel": undefined,
- "tooltipLabel": "Cycle Collect",
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "operation",
- "label": "Operation",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "source",
- "label": "Source",
- },
- Object {
- "format": "file-path",
- "hidden": undefined,
- "key": "filename",
- "label": "Filename",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "threadId",
- "label": "Thread ID",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "FileIO",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "microseconds",
- "hidden": undefined,
- "key": "sampleStartTimeUs",
- "label": "Sample start time",
- },
- Object {
- "format": "microseconds",
- "hidden": undefined,
- "key": "sampleEndTimeUs",
- "label": "Sample end time",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "MediaSample",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "integer",
- "hidden": undefined,
- "key": "elementsTraversed",
- "label": "Elements traversed",
- },
- Object {
- "format": "integer",
- "hidden": undefined,
- "key": "elementsStyled",
- "label": "Elements styled",
- },
- Object {
- "format": "integer",
- "hidden": undefined,
- "key": "elementsMatched",
- "label": "Elements matched",
- },
- Object {
- "format": "integer",
- "hidden": undefined,
- "key": "stylesShared",
- "label": "Styles shared",
- },
- Object {
- "format": "integer",
- "hidden": undefined,
- "key": "stylesReused",
- "label": "Styles reused",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Styles",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "prefName",
- "label": "Name",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "prefKind",
- "label": "Kind",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "prefType",
- "label": "Type",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "prefValue",
- "label": "Value",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "PreferenceRead",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": "{marker.data.name}",
- "colorField": undefined,
- "description": "UserTiming is created using the DOM APIs performance.mark() and performance.measure().",
- "display": Array [
- "marker-chart",
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "entryType",
- "label": "Entry Type",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "UserTiming",
- "tableLabel": "{marker.data.name}",
- "tooltipLabel": "{marker.data.name}",
- },
- Object {
- "chartLabel": "{marker.name} — {marker.data.name}",
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "name",
- "label": "Details",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Text",
- "tableLabel": "{marker.name} — {marker.data.name}",
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-table",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "module",
- "label": "Module",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "name",
- "label": "Name",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Log",
- "tableLabel": "({marker.data.module}) {marker.data.name}",
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": "{marker.data.eventType}",
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "duration",
- "hidden": undefined,
- "key": "latency",
- "label": "Latency",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "eventType",
- "label": "Event Type",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "DOMEvent",
- "tableLabel": "{marker.data.eventType}",
- "tooltipLabel": "{marker.data.eventType} — DOMEvent",
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "category",
- "label": "Type",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Paint",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "category",
- "label": "Type",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Navigation",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "category",
- "label": "Type",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Layout",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": "{marker.data.messageType}",
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-ipc",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "messageType",
- "label": "Type",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "sync",
- "label": "Sync",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "sendThreadName",
- "label": "From",
- },
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "recvThreadName",
- "label": "To",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "IPC",
- "tableLabel": "{marker.name} — {marker.data.messageType} — {marker.data.niceDirection}",
- "tooltipLabel": "IPC — {marker.data.niceDirection}",
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-chart",
- "marker-table",
- "timeline-overview",
- ],
- "fields": Array [
- Object {
- "format": "string",
- "hidden": undefined,
- "key": "name",
- "label": "Tick Reasons",
- },
- ],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "RefreshDriverTick",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
- },
- Object {
- "chartLabel": undefined,
- "colorField": undefined,
- "description": undefined,
- "display": Array [
- "marker-table",
- ],
- "fields": Array [],
- "graphs": undefined,
- "isStackBased": undefined,
- "name": "Network",
- "tableLabel": undefined,
- "tooltipLabel": undefined,
+ "summary": Object {
+ "meta": Object {
+ "categoryNames": Array [
+ "Idle",
+ "Other",
+ "Blocked",
+ "Android",
+ "Java",
+ "Kotlin / KotlinX",
+ "AndroidX",
+ "Mozilla",
+ "Layout",
+ "JavaScript",
+ "GC / CC",
+ "Network",
+ "Graphics",
+ "DOM",
+ ],
+ "importedFrom": undefined,
+ "interval": 5.5,
+ "markerSchemaNames": Array [
+ "GCMajor",
+ "GCMinor",
+ "GCSlice",
+ "CC",
+ "FileIO",
+ "MediaSample",
+ "Styles",
+ "PreferenceRead",
+ "UserTiming",
+ "Text",
+ "Log",
+ "DOMEvent",
+ "Paint",
+ "Navigation",
+ "Layout",
+ "IPC",
+ "RefreshDriverTick",
+ "Network",
+ ],
+ "preprocessedProfileVersion": 68,
+ "product": "ART Trace (Android)",
+ "symbolicated": true,
+ "version": 35,
+ },
+ "sharedCounts": Object {
+ "frames": 2686,
+ "funcs": 1944,
+ "libs": 0,
+ "nativeSymbols": 0,
+ "resources": 0,
+ "stacks": 4239,
+ "strings": 1944,
+ },
+ "threads": Array [
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "main",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1060,
+ "sampleWeightTotal": null,
+ "tid": 21491,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "ReferenceQueueDaemon",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 176,
+ "sampleWeightTotal": null,
+ "tid": 21498,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "FinalizerDaemon",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 177,
+ "sampleWeightTotal": null,
+ "tid": 21499,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "FinalizerWatchdogDaemon",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21500,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "HeapTaskDaemon",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21501,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-2-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21506,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-2-thread-2",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21507,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "GleanAPIPool",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1102,
+ "sampleWeightTotal": null,
+ "tid": 21510,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 472,
+ "sampleWeightTotal": null,
+ "tid": 21511,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-2",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 472,
+ "sampleWeightTotal": null,
+ "tid": 21512,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-3",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 472,
+ "sampleWeightTotal": null,
+ "tid": 21513,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "Gecko",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 813,
+ "sampleWeightTotal": null,
+ "tid": 21515,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "GeckoBackgroundThread",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21516,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "glean.MetricsPingScheduler",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21518,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-4",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 460,
+ "sampleWeightTotal": null,
+ "tid": 21524,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-5",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 459,
+ "sampleWeightTotal": null,
+ "tid": 21525,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-6",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 860,
+ "sampleWeightTotal": null,
+ "tid": 21527,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-3-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 802,
+ "sampleWeightTotal": null,
+ "tid": 21530,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "kotlinx.coroutines.DefaultExecutor",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 806,
+ "sampleWeightTotal": null,
+ "tid": 21531,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "ConnectivityThread",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21534,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-8-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21551,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "queued-work-looper",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21552,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "launcher",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 12,
+ "sampleWeightTotal": null,
+ "tid": 21553,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-2-thread-3",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 3,
+ "sampleWeightTotal": null,
+ "tid": 21588,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-11-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 8,
+ "sampleWeightTotal": null,
+ "tid": 21589,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "SharedPreferencesImpl-load",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21591,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-2-thread-4",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21592,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-12-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 60,
+ "sampleWeightTotal": null,
+ "tid": 21594,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-7",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 332,
+ "sampleWeightTotal": null,
+ "tid": 21596,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-8",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 333,
+ "sampleWeightTotal": null,
+ "tid": 21597,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-9",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 106,
+ "sampleWeightTotal": null,
+ "tid": 21684,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-10",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 426,
+ "sampleWeightTotal": null,
+ "tid": 21685,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-11",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 3,
+ "sampleWeightTotal": null,
+ "tid": 21695,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-12",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 2,
+ "sampleWeightTotal": null,
+ "tid": 21696,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-13",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21697,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-14",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21698,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "DefaultDispatcher-worker-15",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21699,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "Binder:21491_3",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 2,
+ "sampleWeightTotal": null,
+ "tid": 21604,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "pool-4-thread-1",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 17,
+ "sampleWeightTotal": null,
+ "tid": 21721,
+ "weightType": "samples",
+ },
+ Object {
+ "isMainThread": false,
+ "jsAllocationCount": 0,
+ "markerCount": 0,
+ "markerNamesTop": Array [],
+ "name": "SharedPreferencesImpl-load",
+ "nativeAllocationCount": 0,
+ "nativeAllocationWeightTotal": null,
+ "pid": "21491",
+ "sampleCount": 1,
+ "sampleWeightTotal": null,
+ "tid": 21725,
+ "weightType": "samples",
},
],
- "misc": undefined,
- "oscpu": undefined,
- "physicalCPUs": undefined,
- "platform": undefined,
- "preprocessedProfileVersion": 66,
- "processType": 0,
- "product": "ART Trace (Android)",
- "sampleUnits": undefined,
- "sourceURL": undefined,
- "stackwalk": 1,
- "startTime": 0,
- "startTimeAsClockMonotonicNanosecondsSinceBoot": undefined,
- "startTimeAsMachAbsoluteTimeNanoseconds": undefined,
- "startTimeAsQueryPerformanceCounterValue": undefined,
- "symbolicated": true,
- "toolkit": undefined,
- "updateChannel": undefined,
- "version": 34,
- "visualMetrics": undefined,
- },
- "pages": Array [],
- "profileGatheringLog": Object {},
- "profilerOverhead": Array [],
- "profilingLog": Object {},
- "shared": Object {
- "frameTable": Object {
- "address": Array [
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- ],
- "category": Array [
- 3,
- 3,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 1,
- 1,
- 1,
- 1,
- 3,
- 3,
- 3,
- 3,
- 3,
- 4,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 5,
- 5,
- 7,
- 7,
- 7,
- 5,
- 5,
- 7,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 4,
- 4,
- 4,
- 2,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 6,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 5,
- 5,
- 6,
- 5,
- 5,
- 7,
- 7,
- 1,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 6,
- 7,
- 7,
- 5,
- 5,
- 5,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 3,
- 3,
- 3,
- 4,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 6,
- 6,
- 6,
- 3,
- 3,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 4,
- 4,
- 4,
- 4,
- 3,
- 3,
- 3,
- 3,
- 6,
- 4,
- 4,
- 4,
- 4,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 1,
- 1,
- 4,
- 4,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 6,
- 3,
- 6,
- 4,
- 4,
- 4,
- 7,
- 6,
- 4,
- 6,
- 6,
- 6,
- 6,
- 6,
- 4,
- 4,
- 7,
- 6,
- 4,
- 4,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 4,
- 7,
- 7,
- 1,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 7,
- 6,
- 7,
- 7,
- 7,
- 3,
- 4,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 4,
- 6,
- 6,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 1,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 7,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 4,
- 7,
- 7,
- 7,
- 7,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 7,
- 7,
- 7,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 7,
- 7,
- 6,
- 6,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 7,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 3,
- 6,
- 3,
- 6,
- 6,
- 6,
- 6,
- 7,
- 6,
- 6,
- 4,
- 7,
- 7,
- 5,
- 5,
- 5,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 7,
- 6,
- 3,
- 6,
- 7,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 4,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 3,
- 3,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 3,
- 6,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 4,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 7,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 3,
- 0,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 1,
- 7,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 1,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 5,
- 7,
- 7,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 5,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 1,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 3,
- 3,
- 3,
- 7,
- 1,
- 7,
- 4,
- 3,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 3,
- 4,
- 4,
- 4,
- 5,
- 5,
- 6,
- 5,
- 6,
- 6,
- 7,
- 7,
- 7,
- 1,
- 7,
- 7,
- 5,
- 1,
- 7,
- 7,
- 1,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 1,
- 7,
- 7,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 3,
- 6,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 1,
- 1,
- 7,
- 5,
- 5,
- 5,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 4,
- 1,
- 1,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 3,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 3,
- 3,
- 7,
- 3,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 6,
- 6,
- 7,
- 7,
- 7,
- 6,
- 6,
- 7,
- 6,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 4,
- 6,
- 6,
- 6,
- 3,
- 6,
- 3,
- 3,
- 3,
- 6,
- 7,
- 6,
- 6,
- 3,
- 3,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 5,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 1,
- 4,
- 6,
- 6,
- 3,
- 3,
- 3,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 6,
- 3,
- 6,
- 6,
- 3,
- 1,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 6,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 1,
- 7,
- 1,
- 7,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 1,
- 4,
- 4,
- 7,
- 7,
- 7,
- 4,
- 4,
- 7,
- 7,
- 7,
- 3,
- 3,
- 2,
- 3,
- 7,
- 7,
- 3,
- 3,
- 4,
- 4,
- 4,
- 2,
- 4,
- 4,
- 4,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 2,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 7,
- 1,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 1,
- 7,
- 1,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 7,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 4,
- 7,
- 2,
- 7,
- 5,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 3,
- 3,
- 3,
- 5,
- 5,
- 4,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 1,
- 1,
- 1,
- 1,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 2,
- 5,
- 7,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 1,
- 1,
- 4,
- 1,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 7,
- 5,
- 3,
- 3,
- 4,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 3,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 7,
- 7,
- 5,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 7,
- 7,
- 7,
- 5,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 4,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 7,
- 6,
- 6,
- 7,
- 7,
- 3,
- 3,
- 0,
- 4,
- 4,
- 2,
- 2,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 5,
- 5,
- 4,
- 7,
- 7,
- 5,
- 5,
- 5,
- 4,
- 4,
- 5,
- 5,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 6,
- 6,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 1,
- 1,
- 4,
- 4,
- 4,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 5,
- 7,
- 5,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 4,
- 4,
- 4,
- 4,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 7,
- 1,
- 4,
- 7,
- 7,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 1,
- 1,
- 7,
- 7,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 4,
- 4,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 4,
- 4,
- 5,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 5,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 7,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 1,
- 7,
- 7,
- 7,
- 1,
- 4,
- 1,
- 4,
- 7,
- 7,
- 7,
- 7,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 1,
- 4,
- 4,
- 4,
- 3,
- 3,
- 4,
- 7,
- 7,
- 5,
- 4,
- 4,
- 4,
- 4,
- 7,
- 7,
- 7,
- 7,
- 7,
- 4,
- 4,
- 4,
- 4,
- 1,
- 4,
- 4,
- 5,
- 5,
- 5,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 4,
- 7,
- 7,
- 5,
- 5,
- 5,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 3,
- 3,
- 3,
- 7,
- 4,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 7,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 4,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 3,
- 3,
- 3,
- 0,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 3,
- 3,
- 3,
- 0,
- 7,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 4,
- 4,
- 4,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 6,
- 6,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 4,
- 4,
- 4,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 2,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 4,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 3,
- 3,
- 3,
- 3,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 4,
- 4,
- 4,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 6,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 6,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 3,
- 3,
- 3,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 2,
- 5,
- 7,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 7,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 4,
- 4,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 1,
- 1,
- 4,
- 4,
- 4,
- 3,
- 3,
- 3,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 3,
- 4,
- 4,
- 4,
- 4,
- 2,
- 7,
- 7,
- 3,
- 3,
- 3,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 5,
- 5,
- 4,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 3,
- 4,
- 4,
- 1,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 7,
- 7,
- 7,
- 5,
- 5,
- 5,
- 5,
- 6,
- 7,
- 7,
- 5,
- 5,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 7,
- 5,
- 5,
- 5,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 6,
- 5,
- 5,
- 4,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 3,
- 3,
- 4,
- 4,
- 4,
- 2,
- 5,
- 5,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 4,
- 4,
- 4,
- 2,
- 5,
- 4,
- 4,
- 4,
- 2,
- 3,
- 7,
- 3,
- 4,
- 4,
- 4,
- 5,
- 5,
- 7,
- 7,
- 7,
- 5,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 4,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 7,
- 7,
- 7,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 4,
- 2,
- 3,
- 3,
- 3,
- 3,
- 1,
- 1,
- 1,
- 4,
- 4,
- 4,
- 4,
- 4,
- 1,
- ],
- "column": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "func": Array [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25,
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 34,
- 36,
- 37,
- 38,
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61,
- 62,
- 63,
- 64,
- 64,
- 65,
- 66,
- 67,
- 68,
- 69,
- 70,
- 71,
- 72,
- 73,
- 74,
- 75,
- 76,
- 77,
- 78,
- 79,
- 80,
- 81,
- 82,
- 83,
- 83,
- 84,
- 84,
- 85,
- 86,
- 87,
- 88,
- 89,
- 90,
- 91,
- 92,
- 93,
- 94,
- 95,
- 96,
- 97,
- 98,
- 99,
- 100,
- 101,
- 102,
- 103,
- 104,
- 105,
- 106,
- 107,
- 108,
- 109,
- 110,
- 111,
- 112,
- 113,
- 114,
- 115,
- 116,
- 116,
- 117,
- 118,
- 119,
- 120,
- 121,
- 121,
- 121,
- 122,
- 123,
- 124,
- 125,
- 126,
- 127,
- 128,
- 129,
- 130,
- 131,
- 132,
- 133,
- 134,
- 135,
- 136,
- 137,
- 138,
- 139,
- 140,
- 141,
- 142,
- 143,
- 144,
- 145,
- 146,
- 147,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 155,
- 156,
- 156,
- 157,
- 158,
- 159,
- 160,
- 161,
- 162,
- 163,
- 164,
- 165,
- 166,
- 167,
- 167,
- 168,
- 168,
- 169,
- 170,
- 171,
- 171,
- 172,
- 173,
- 174,
- 175,
- 176,
- 177,
- 178,
- 179,
- 180,
- 181,
- 182,
- 183,
- 184,
- 185,
- 186,
- 187,
- 188,
- 189,
- 190,
- 191,
- 192,
- 193,
- 194,
- 195,
- 196,
- 197,
- 198,
- 199,
- 200,
- 201,
- 202,
- 203,
- 204,
- 205,
- 206,
- 207,
- 208,
- 209,
- 210,
- 211,
- 212,
- 213,
- 214,
- 215,
- 216,
- 217,
- 218,
- 219,
- 220,
- 221,
- 222,
- 223,
- 224,
- 225,
- 226,
- 227,
- 228,
- 229,
- 230,
- 231,
- 232,
- 233,
- 234,
- 235,
- 236,
- 237,
- 238,
- 239,
- 240,
- 241,
- 242,
- 243,
- 244,
- 245,
- 246,
- 247,
- 248,
- 249,
- 250,
- 251,
- 252,
- 253,
- 254,
- 255,
- 256,
- 257,
- 258,
- 259,
- 260,
- 261,
- 262,
- 263,
- 264,
- 265,
- 266,
- 267,
- 268,
- 269,
- 270,
- 271,
- 272,
- 273,
- 274,
- 275,
- 276,
- 277,
- 278,
- 279,
- 280,
- 281,
- 282,
- 283,
- 284,
- 285,
- 286,
- 287,
- 288,
- 289,
- 290,
- 291,
- 292,
- 293,
- 294,
- 295,
- 296,
- 297,
- 298,
- 299,
- 300,
- 301,
- 302,
- 303,
- 304,
- 305,
- 306,
- 307,
- 308,
- 309,
- 310,
- 311,
- 312,
- 312,
- 312,
- 313,
- 313,
- 314,
- 315,
- 316,
- 317,
- 318,
- 319,
- 320,
- 321,
- 322,
- 322,
- 323,
- 324,
- 325,
- 326,
- 327,
- 328,
- 329,
- 330,
- 330,
- 331,
- 332,
- 333,
- 334,
- 335,
- 336,
- 337,
- 338,
- 339,
- 340,
- 341,
- 342,
- 343,
- 344,
- 345,
- 345,
- 346,
- 347,
- 348,
- 349,
- 350,
- 351,
- 352,
- 352,
- 353,
- 354,
- 355,
- 356,
- 357,
- 358,
- 359,
- 360,
- 361,
- 362,
- 363,
- 364,
- 365,
- 366,
- 367,
- 368,
- 369,
- 370,
- 371,
- 372,
- 373,
- 374,
- 375,
- 376,
- 377,
- 378,
- 379,
- 380,
- 381,
- 357,
- 382,
- 383,
- 384,
- 385,
- 385,
- 386,
- 387,
- 388,
- 389,
- 390,
- 391,
- 392,
- 393,
- 394,
- 394,
- 395,
- 396,
- 397,
- 398,
- 399,
- 400,
- 401,
- 402,
- 403,
- 404,
- 405,
- 333,
- 406,
- 407,
- 408,
- 409,
- 410,
- 411,
- 412,
- 413,
- 414,
- 415,
- 416,
- 416,
- 417,
- 418,
- 419,
- 420,
- 421,
- 421,
- 422,
- 423,
- 424,
- 425,
- 425,
- 425,
- 426,
- 427,
- 428,
- 429,
- 429,
- 430,
- 431,
- 432,
- 433,
- 434,
- 435,
- 436,
- 437,
- 438,
- 439,
- 440,
- 440,
- 440,
- 441,
- 442,
- 443,
- 444,
- 445,
- 446,
- 447,
- 447,
- 448,
- 449,
- 450,
- 451,
- 451,
- 452,
- 453,
- 454,
- 454,
- 455,
- 456,
- 457,
- 458,
- 459,
- 460,
- 461,
- 462,
- 463,
- 464,
- 465,
- 466,
- 467,
- 468,
- 469,
- 470,
- 471,
- 471,
- 471,
- 472,
- 473,
- 474,
- 475,
- 475,
- 475,
- 476,
- 477,
- 478,
- 479,
- 480,
- 481,
- 482,
- 483,
- 483,
- 483,
- 484,
- 485,
- 486,
- 487,
- 487,
- 488,
- 489,
- 489,
- 490,
- 490,
- 490,
- 491,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 498,
- 498,
- 499,
- 500,
- 500,
- 501,
- 502,
- 503,
- 504,
- 505,
- 506,
- 504,
- 504,
- 507,
- 508,
- 509,
- 510,
- 511,
- 512,
- 513,
- 514,
- 515,
- 516,
- 517,
- 518,
- 519,
- 520,
- 521,
- 522,
- 523,
- 524,
- 525,
- 526,
- 527,
- 528,
- 529,
- 530,
- 531,
- 532,
- 533,
- 534,
- 535,
- 536,
- 537,
- 538,
- 539,
- 540,
- 541,
- 542,
- 543,
- 543,
- 544,
- 545,
- 546,
- 547,
- 548,
- 549,
- 550,
- 551,
- 552,
- 553,
- 554,
- 555,
- 556,
- 557,
- 558,
- 559,
- 559,
- 560,
- 561,
- 561,
- 501,
- 562,
- 563,
- 564,
- 565,
- 566,
- 567,
- 568,
- 569,
- 570,
- 571,
- 572,
- 573,
- 574,
- 575,
- 576,
- 577,
- 578,
- 579,
- 580,
- 581,
- 582,
- 583,
- 584,
- 585,
- 586,
- 587,
- 588,
- 589,
- 590,
- 591,
- 592,
- 593,
- 594,
- 595,
- 596,
- 597,
- 598,
- 599,
- 600,
- 600,
- 601,
- 602,
- 603,
- 603,
- 604,
- 605,
- 606,
- 607,
- 608,
- 609,
- 610,
- 611,
- 612,
- 613,
- 614,
- 615,
- 616,
- 617,
- 618,
- 619,
- 620,
- 621,
- 622,
- 623,
- 624,
- 625,
- 626,
- 627,
- 628,
- 629,
- 630,
- 631,
- 632,
- 633,
- 634,
- 635,
- 635,
- 636,
- 637,
- 638,
- 639,
- 640,
- 641,
- 642,
- 643,
- 644,
- 645,
- 646,
- 647,
- 648,
- 649,
- 650,
- 651,
- 652,
- 653,
- 654,
- 655,
- 656,
- 657,
- 658,
- 659,
- 660,
- 661,
- 662,
- 663,
- 664,
- 665,
- 666,
- 666,
- 667,
- 668,
- 669,
- 670,
- 671,
- 672,
- 673,
- 674,
- 675,
- 676,
- 677,
- 678,
- 679,
- 680,
- 681,
- 682,
- 683,
- 684,
- 685,
- 686,
- 687,
- 688,
- 689,
- 690,
- 691,
- 692,
- 693,
- 694,
- 695,
- 696,
- 697,
- 698,
- 699,
- 700,
- 701,
- 702,
- 703,
- 704,
- 705,
- 706,
- 707,
- 708,
- 709,
- 710,
- 710,
- 711,
- 712,
- 713,
- 714,
- 715,
- 716,
- 717,
- 718,
- 719,
- 720,
- 721,
- 722,
- 723,
- 724,
- 725,
- 726,
- 727,
- 728,
- 729,
- 730,
- 731,
- 732,
- 733,
- 734,
- 735,
- 736,
- 737,
- 738,
- 739,
- 740,
- 741,
- 742,
- 743,
- 744,
- 745,
- 746,
- 747,
- 748,
- 749,
- 750,
- 751,
- 752,
- 753,
- 754,
- 755,
- 756,
- 757,
- 758,
- 759,
- 759,
- 760,
- 761,
- 762,
- 763,
- 764,
- 765,
- 766,
- 767,
- 768,
- 769,
- 770,
- 771,
- 772,
- 773,
- 774,
- 775,
- 776,
- 777,
- 778,
- 779,
- 780,
- 781,
- 779,
- 782,
- 783,
- 784,
- 785,
- 786,
- 787,
- 788,
- 789,
- 790,
- 791,
- 792,
- 793,
- 794,
- 795,
- 796,
- 797,
- 798,
- 799,
- 800,
- 801,
- 802,
- 803,
- 804,
- 805,
- 806,
- 807,
- 808,
- 809,
- 810,
- 811,
- 812,
- 813,
- 814,
- 815,
- 816,
- 817,
- 818,
- 819,
- 820,
- 821,
- 822,
- 823,
- 824,
- 825,
- 826,
- 827,
- 828,
- 829,
- 830,
- 831,
- 832,
- 833,
- 834,
- 835,
- 836,
- 837,
- 838,
- 839,
- 840,
- 841,
- 842,
- 843,
- 844,
- 845,
- 846,
- 847,
- 848,
- 849,
- 850,
- 850,
- 851,
- 852,
- 853,
- 854,
- 855,
- 856,
- 857,
- 858,
- 859,
- 860,
- 860,
- 861,
- 862,
- 863,
- 864,
- 865,
- 866,
- 867,
- 868,
- 869,
- 870,
- 871,
- 872,
- 873,
- 874,
- 875,
- 876,
- 877,
- 878,
- 879,
- 880,
- 881,
- 882,
- 883,
- 884,
- 885,
- 886,
- 887,
- 888,
- 889,
- 889,
- 890,
- 891,
- 892,
- 893,
- 894,
- 895,
- 896,
- 897,
- 898,
- 899,
- 900,
- 901,
- 902,
- 903,
- 904,
- 905,
- 906,
- 907,
- 908,
- 909,
- 910,
- 911,
- 912,
- 913,
- 914,
- 915,
- 916,
- 917,
- 918,
- 919,
- 920,
- 921,
- 922,
- 923,
- 924,
- 925,
- 926,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 933,
- 934,
- 935,
- 935,
- 936,
- 937,
- 938,
- 939,
- 940,
- 941,
- 942,
- 943,
- 944,
- 945,
- 946,
- 947,
- 948,
- 949,
- 950,
- 951,
- 952,
- 953,
- 954,
- 955,
- 956,
- 957,
- 958,
- 959,
- 960,
- 961,
- 962,
- 963,
- 964,
- 965,
- 966,
- 967,
- 968,
- 969,
- 970,
- 971,
- 972,
- 973,
- 974,
- 975,
- 976,
- 977,
- 978,
- 979,
- 980,
- 981,
- 982,
- 983,
- 984,
- 985,
- 986,
- 987,
- 988,
- 989,
- 990,
- 991,
- 992,
- 993,
- 994,
- 995,
- 996,
- 997,
- 998,
- 999,
- 1000,
- 1001,
- 1002,
- 1003,
- 1004,
- 1005,
- 1006,
- 1007,
- 1008,
- 1009,
- 1010,
- 1011,
- 1012,
- 1013,
- 1014,
- 1015,
- 1016,
- 1017,
- 1018,
- 1019,
- 1020,
- 1021,
- 1022,
- 1023,
- 1024,
- 1025,
- 1026,
- 1027,
- 1028,
- 1029,
- 1030,
- 1031,
- 1032,
- 1033,
- 1034,
- 1035,
- 1036,
- 1037,
- 1038,
- 1039,
- 1040,
- 1041,
- 1042,
- 1043,
- 1044,
- 1045,
- 1046,
- 1046,
- 1047,
- 1048,
- 1049,
- 1050,
- 1051,
- 1052,
- 1053,
- 1054,
- 1054,
- 1055,
- 1056,
- 1057,
- 1058,
- 1059,
- 1060,
- 1061,
- 1062,
- 1063,
- 1064,
- 1064,
- 1065,
- 1066,
- 1067,
- 1068,
- 1069,
- 1070,
- 1071,
- 1072,
- 1073,
- 1074,
- 1075,
- 1076,
- 1077,
- 1078,
- 1079,
- 1080,
- 1081,
- 1082,
- 1083,
- 1084,
- 1085,
- 1086,
- 1087,
- 1088,
- 1089,
- 1090,
- 1091,
- 1092,
- 1093,
- 1094,
- 1095,
- 1096,
- 1097,
- 1098,
- 1099,
- 1100,
- 1101,
- 1102,
- 1103,
- 1104,
- 1105,
- 1106,
- 1107,
- 1108,
- 1109,
- 1110,
- 1111,
- 1112,
- 1113,
- 1114,
- 1115,
- 1116,
- 1117,
- 1118,
- 1119,
- 1120,
- 1121,
- 1122,
- 1123,
- 1124,
- 1125,
- 1126,
- 1127,
- 1128,
- 1129,
- 1130,
- 1131,
- 1132,
- 1133,
- 1134,
- 1135,
- 1136,
- 1137,
- 1138,
- 1139,
- 1140,
- 1141,
- 1142,
- 1142,
- 1143,
- 1144,
- 1145,
- 1146,
- 1146,
- 1147,
- 1148,
- 1149,
- 1150,
- 1151,
- 1152,
- 1153,
- 1154,
- 1155,
- 1156,
- 1157,
- 1158,
- 1159,
- 1160,
- 1161,
- 1162,
- 1163,
- 1164,
- 1165,
- 1166,
- 1167,
- 1168,
- 1169,
- 1170,
- 1171,
- 1172,
- 1173,
- 1174,
- 1175,
- 1176,
- 1177,
- 1178,
- 1179,
- 1180,
- 1181,
- 1182,
- 1183,
- 1184,
- 1185,
- 1186,
- 443,
- 1187,
- 315,
- 1188,
- 1189,
- 1190,
- 1191,
- 1192,
- 1193,
- 1194,
- 1195,
- 1196,
- 1197,
- 1198,
- 1199,
- 719,
- 1200,
- 1201,
- 1202,
- 1202,
- 1203,
- 1204,
- 1205,
- 1206,
- 1207,
- 1208,
- 1209,
- 1210,
- 1211,
- 1211,
- 1212,
- 1213,
- 1214,
- 1215,
- 1216,
- 1217,
- 1218,
- 1219,
- 1220,
- 1220,
- 1221,
- 1222,
- 1223,
- 1224,
- 1225,
- 1226,
- 1227,
- 1228,
- 1229,
- 1230,
- 1231,
- 1232,
- 1232,
- 1233,
- 1234,
- 1235,
- 1236,
- 1237,
- 1238,
- 1239,
- 1240,
- 1241,
- 1242,
- 1243,
- 1244,
- 1245,
- 1246,
- 1247,
- 1248,
- 1249,
- 1250,
- 1250,
- 1251,
- 1252,
- 1252,
- 1253,
- 1254,
- 1255,
- 1256,
- 1257,
- 1258,
- 1259,
- 1260,
- 1261,
- 1262,
- 1263,
- 1264,
- 1265,
- 1266,
- 1258,
- 1267,
- 1268,
- 1269,
- 1270,
- 1271,
- 1272,
- 1273,
- 1274,
- 1275,
- 1276,
- 1277,
- 1278,
- 1279,
- 1280,
- 1281,
- 1282,
- 1283,
- 1284,
- 1285,
- 1286,
- 1287,
- 1288,
- 1289,
- 1290,
- 1291,
- 1292,
- 1293,
- 1294,
- 1295,
- 1296,
- 1297,
- 1298,
- 1299,
- 1300,
- 1300,
- 1301,
- 1302,
- 1303,
- 1304,
- 1305,
- 1306,
- 1307,
- 1308,
- 1309,
- 1310,
- 1311,
- 1312,
- 1313,
- 1314,
- 1315,
- 1316,
- 1317,
- 1317,
- 1318,
- 1318,
- 1319,
- 1320,
- 1321,
- 1322,
- 1323,
- 1324,
- 1325,
- 1326,
- 1327,
- 1328,
- 1329,
- 1330,
- 1331,
- 1332,
- 1333,
- 1333,
- 1334,
- 1335,
- 1336,
- 1337,
- 1338,
- 1339,
- 1339,
- 386,
- 1340,
- 1341,
- 1342,
- 1342,
- 1343,
- 1344,
- 146,
- 1345,
- 1346,
- 1347,
- 1348,
- 1349,
- 1350,
- 1351,
- 1352,
- 146,
- 1353,
- 1354,
- 1355,
- 1356,
- 1357,
- 1350,
- 1351,
- 1358,
- 1359,
- 1359,
- 146,
- 146,
- 1360,
- 1361,
- 1362,
- 1363,
- 1364,
- 1350,
- 1351,
- 1365,
- 1366,
- 1367,
- 1368,
- 1368,
- 1368,
- 1350,
- 1351,
- 1369,
- 1370,
- 1350,
- 1371,
- 1372,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1350,
- 1371,
- 1372,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1350,
- 1371,
- 1372,
- 1377,
- 1378,
- 1379,
- 97,
- 98,
- 1380,
- 1381,
- 1382,
- 1383,
- 1384,
- 119,
- 120,
- 386,
- 386,
- 1385,
- 1373,
- 1386,
- 1386,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1387,
- 1388,
- 1389,
- 1390,
- 121,
- 121,
- 121,
- 122,
- 123,
- 124,
- 246,
- 962,
- 1391,
- 1392,
- 1393,
- 1394,
- 1395,
- 913,
- 1396,
- 1397,
- 1398,
- 1399,
- 1400,
- 1401,
- 1316,
- 1402,
- 1403,
- 1404,
- 1405,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 1408,
- 1409,
- 1410,
- 1411,
- 1412,
- 1413,
- 241,
- 1414,
- 243,
- 244,
- 1415,
- 642,
- 1416,
- 1417,
- 1418,
- 1419,
- 1420,
- 1421,
- 146,
- 1422,
- 1423,
- 1424,
- 1425,
- 1426,
- 1427,
- 1428,
- 1429,
- 1430,
- 1431,
- 1432,
- 1433,
- 1434,
- 1435,
- 1436,
- 1437,
- 613,
- 214,
- 215,
- 216,
- 543,
- 543,
- 544,
- 219,
- 221,
- 222,
- 223,
- 224,
- 225,
- 1438,
- 1439,
- 1440,
- 1441,
- 1442,
- 1443,
- 1444,
- 1444,
- 1445,
- 1445,
- 1446,
- 1447,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 220,
- 1448,
- 1449,
- 1450,
- 1451,
- 1407,
- 97,
- 98,
- 1417,
- 1418,
- 1452,
- 1302,
- 1453,
- 1421,
- 146,
- 1454,
- 1455,
- 1337,
- 1456,
- 1457,
- 1458,
- 1459,
- 1460,
- 1460,
- 1461,
- 1462,
- 1463,
- 1464,
- 1465,
- 1466,
- 1467,
- 1468,
- 1469,
- 1470,
- 1471,
- 1472,
- 1473,
- 1474,
- 1475,
- 1475,
- 1476,
- 1476,
- 1477,
- 1478,
- 1442,
- 1443,
- 1444,
- 1444,
- 1479,
- 1480,
- 280,
- 1481,
- 1482,
- 1483,
- 1484,
- 1485,
- 1486,
- 865,
- 866,
- 867,
- 1420,
- 1487,
- 1488,
- 1489,
- 1490,
- 1491,
- 1445,
- 1445,
- 1446,
- 1447,
- 1427,
- 1428,
- 1429,
- 1492,
- 1493,
- 1494,
- 1495,
- 1496,
- 1497,
- 1498,
- 1499,
- 356,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 1500,
- 1501,
- 1502,
- 1503,
- 1504,
- 1504,
- 1505,
- 1506,
- 1507,
- 1508,
- 1065,
- 1509,
- 1510,
- 1511,
- 1512,
- 1513,
- 1514,
- 1515,
- 1438,
- 1439,
- 1440,
- 1441,
- 1516,
- 1517,
- 1518,
- 1519,
- 1520,
- 1521,
- 1522,
- 1523,
- 1524,
- 1525,
- 1225,
- 1226,
- 1227,
- 77,
- 78,
- 1526,
- 604,
- 604,
- 1527,
- 1528,
- 1529,
- 1530,
- 1531,
- 1532,
- 1303,
- 1533,
- 1534,
- 1535,
- 4,
- 823,
- 824,
- 1536,
- 1537,
- 146,
- 146,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 246,
- 962,
- 1391,
- 1538,
- 1539,
- 1540,
- 1541,
- 1542,
- 1543,
- 1544,
- 1545,
- 1546,
- 1547,
- 1548,
- 1549,
- 1550,
- 1551,
- 1552,
- 1553,
- 1554,
- 1555,
- 1229,
- 625,
- 1556,
- 1557,
- 1558,
- 1559,
- 1560,
- 1561,
- 1420,
- 1562,
- 1442,
- 1443,
- 1444,
- 1444,
- 1563,
- 1564,
- 352,
- 352,
- 353,
- 1565,
- 1566,
- 1567,
- 1568,
- 1569,
- 1569,
- 1570,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 246,
- 962,
- 1391,
- 1538,
- 1539,
- 1392,
- 1393,
- 1394,
- 1395,
- 913,
- 1571,
- 1572,
- 1573,
- 1574,
- 115,
- 1575,
- 1576,
- 1577,
- 1578,
- 1579,
- 1580,
- 1581,
- 1582,
- 1583,
- 1584,
- 1585,
- 1586,
- 1587,
- 1587,
- 1588,
- 1589,
- 1590,
- 119,
- 120,
- 386,
- 386,
- 1340,
- 1591,
- 1592,
- 2,
- 1593,
- 1594,
- 1595,
- 1596,
- 1597,
- 1598,
- 1599,
- 1600,
- 1601,
- 1602,
- 1603,
- 1604,
- 1605,
- 1606,
- 1607,
- 1607,
- 1608,
- 1609,
- 1610,
- 1611,
- 1612,
- 1613,
- 1613,
- 1613,
- 1613,
- 1614,
- 1615,
- 1616,
- 1617,
- 1617,
- 1618,
- 121,
- 121,
- 121,
- 122,
- 123,
- 124,
- 220,
- 1448,
- 1449,
- 1619,
- 1620,
- 1621,
- 1442,
- 1443,
- 1444,
- 1569,
- 1569,
- 1570,
- 1444,
- 1445,
- 1445,
- 1446,
- 1447,
- 1427,
- 1428,
- 1429,
- 1622,
- 1623,
- 1623,
- 1624,
- 1478,
- 1406,
- 1407,
- 97,
- 98,
- 1625,
- 1626,
- 1627,
- 1628,
- 642,
- 1629,
- 1630,
- 613,
- 214,
- 215,
- 216,
- 543,
- 543,
- 544,
- 219,
- 221,
- 222,
- 223,
- 224,
- 225,
- 1631,
- 1632,
- 1633,
- 141,
- 142,
- 143,
- 144,
- 145,
- 146,
- 164,
- 1634,
- 143,
- 1635,
- 1636,
- 1637,
- 1638,
- 1639,
- 252,
- 253,
- 1412,
- 1640,
- 1641,
- 1581,
- 115,
- 1582,
- 1583,
- 1599,
- 1600,
- 119,
- 120,
- 386,
- 386,
- 1340,
- 1642,
- 1643,
- 1644,
- 1644,
- 1645,
- 1646,
- 1647,
- 1648,
- 1648,
- 1649,
- 1229,
- 1650,
- 1385,
- 1651,
- 1652,
- 1611,
- 1612,
- 1613,
- 1613,
- 1613,
- 1613,
- 1653,
- 1420,
- 1654,
- 1655,
- 1656,
- 1438,
- 1657,
- 1658,
- 1659,
- 1660,
- 1661,
- 1662,
- 1663,
- 1482,
- 1487,
- 1488,
- 1664,
- 1665,
- 1508,
- 1065,
- 903,
- 1666,
- 1489,
- 1490,
- 1491,
- 1667,
- 1668,
- 1669,
- 1670,
- 1671,
- 1619,
- 1620,
- 1672,
- 1673,
- 1674,
- 1675,
- 1676,
- 1677,
- 1677,
- 1678,
- 1679,
- 1680,
- 1681,
- 1682,
- 1439,
- 1440,
- 1683,
- 1684,
- 1685,
- 1686,
- 1687,
- 1350,
- 1371,
- 1372,
- 97,
- 98,
- 1688,
- 1689,
- 1690,
- 1691,
- 1692,
- 1693,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1420,
- 1694,
- 768,
- 141,
- 142,
- 164,
- 1695,
- 1696,
- 1697,
- 910,
- 911,
- 912,
- 913,
- 214,
- 215,
- 216,
- 1698,
- 1699,
- 1700,
- 1701,
- 1702,
- 1703,
- 81,
- 1704,
- 233,
- 881,
- 882,
- 950,
- 1052,
- 237,
- 238,
- 239,
- 240,
- 241,
- 242,
- 243,
- 244,
- 1705,
- 1706,
- 1707,
- 1708,
- 1709,
- 1550,
- 1710,
- 1394,
- 1711,
- 1014,
- 1015,
- 1016,
- 1017,
- 1712,
- 1713,
- 1714,
- 246,
- 247,
- 1715,
- 1716,
- 962,
- 1391,
- 1392,
- 1393,
- 1717,
- 1051,
- 1718,
- 1719,
- 646,
- 771,
- 1720,
- 1721,
- 1722,
- 1723,
- 1724,
- 1528,
- 1529,
- 1530,
- 1725,
- 1726,
- 1727,
- 1728,
- 1729,
- 1730,
- 1038,
- 1039,
- 236,
- 230,
- 231,
- 1731,
- 252,
- 1732,
- 222,
- 223,
- 224,
- 225,
- 1350,
- 1733,
- 143,
- 144,
- 145,
- 146,
- 1734,
- 1735,
- 4,
- 823,
- 824,
- 1350,
- 1371,
- 1372,
- 1373,
- 1386,
- 1386,
- 1736,
- 143,
- 144,
- 145,
- 146,
- 1735,
- 4,
- 823,
- 824,
- 1737,
- 1738,
- 1739,
- 1740,
- 1741,
- 1742,
- 1743,
- 1744,
- 1745,
- 77,
- 78,
- 1350,
- 1371,
- 1372,
- 1746,
- 1747,
- 1748,
- 1749,
- 1750,
- 1750,
- 1751,
- 1752,
- 1753,
- 1754,
- 1755,
- 1756,
- 1757,
- 1758,
- 1759,
- 1760,
- 1761,
- 1762,
- 1763,
- 1764,
- 1765,
- 1766,
- 1767,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1350,
- 1371,
- 1372,
- 97,
- 98,
- 1768,
- 1769,
- 1770,
- 1771,
- 1772,
- 1773,
- 1774,
- 1775,
- 1344,
- 146,
- 1776,
- 1777,
- 1778,
- 1779,
- 1780,
- 115,
- 1781,
- 1782,
- 1783,
- 1784,
- 1785,
- 1786,
- 1787,
- 1788,
- 1789,
- 1790,
- 77,
- 78,
- 1791,
- 1792,
- 1793,
- 1794,
- 1795,
- 1796,
- 1587,
- 1587,
- 1797,
- 1798,
- 1799,
- 1800,
- 1801,
- 1801,
- 1802,
- 1803,
- 1804,
- 119,
- 120,
- 386,
- 386,
- 1340,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1805,
- 1806,
- 1807,
- 1808,
- 1809,
- 1810,
- 1350,
- 1371,
- 1372,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1350,
- 1371,
- 1372,
- 1378,
- 1811,
- 1812,
- 1813,
- 1814,
- 1815,
- 1816,
- 1817,
- 1818,
- 1819,
- 1820,
- 1821,
- 1822,
- 1823,
- 1824,
- 1825,
- 1826,
- 1827,
- 1827,
- 1828,
- 1829,
- 1830,
- 1831,
- 1831,
- 1832,
- 1833,
- 1833,
- 1834,
- 1835,
- 1836,
- 1837,
- 1838,
- 1839,
- 1840,
- 1841,
- 1842,
- 1843,
- 1844,
- 1845,
- 1846,
- 1847,
- 1848,
- 1849,
- 1850,
- 1851,
- 1852,
- 1853,
- 1854,
- 1855,
- 1856,
- 1857,
- 811,
- 1858,
- 1859,
- 1860,
- 1861,
- 1862,
- 1863,
- 1859,
- 1864,
- 1865,
- 1866,
- 1867,
- 1868,
- 1869,
- 1870,
- 1871,
- 1872,
- 1873,
- 1874,
- 1875,
- 1876,
- 1877,
- 1878,
- 1879,
- 1880,
- 1881,
- 1882,
- 1883,
- 1884,
- 1885,
- 1886,
- 1373,
- 1887,
- 1888,
- 1889,
- 143,
- 144,
- 145,
- 146,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 1442,
- 1443,
- 1444,
- 1444,
- 1890,
- 1890,
- 1891,
- 1513,
- 1409,
- 1410,
- 1411,
- 1412,
- 642,
- 1416,
- 1417,
- 1418,
- 1421,
- 146,
- 1454,
- 1455,
- 1337,
- 1456,
- 1457,
- 1458,
- 1459,
- 1460,
- 1460,
- 1461,
- 1462,
- 1463,
- 1464,
- 1465,
- 1466,
- 1467,
- 1468,
- 1469,
- 1470,
- 1471,
- 1472,
- 1473,
- 1474,
- 1892,
- 1893,
- 1894,
- 1422,
- 1504,
- 1504,
- 1505,
- 1506,
- 1437,
- 613,
- 214,
- 215,
- 216,
- 543,
- 543,
- 544,
- 219,
- 1448,
- 1449,
- 1619,
- 1620,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1407,
- 97,
- 98,
- 1442,
- 1443,
- 1444,
- 1444,
- 1563,
- 1564,
- 352,
- 352,
- 353,
- 1890,
- 1890,
- 1891,
- 1438,
- 1439,
- 1440,
- 1406,
- 1407,
- 97,
- 98,
- 1442,
- 1443,
- 400,
- 401,
- 143,
- 144,
- 145,
- 146,
- 1444,
- 1444,
- 1890,
- 1890,
- 1891,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 220,
- 1448,
- 1449,
- 1450,
- 1451,
- 1407,
- 97,
- 98,
- 1442,
- 1443,
- 1444,
- 1444,
- 1895,
- 1319,
- 1319,
- 1320,
- 1438,
- 1439,
- 1440,
- 1578,
- 1605,
- 1896,
- 1897,
- 1898,
- 1899,
- 212,
- 213,
- 214,
- 215,
- 249,
- 1900,
- 1901,
- 252,
- 253,
- 1616,
- 119,
- 120,
- 386,
- 386,
- 1617,
- 1617,
- 1651,
- 1902,
- 238,
- 1413,
- 241,
- 242,
- 243,
- 244,
- 1903,
- 1904,
- 1905,
- 246,
- 1906,
- 1014,
- 1015,
- 1907,
- 1908,
- 1909,
- 1406,
- 220,
- 1448,
- 1449,
- 1407,
- 97,
- 98,
- 1442,
- 1443,
- 1444,
- 1569,
- 1569,
- 143,
- 144,
- 145,
- 146,
- 1406,
- 1438,
- 1910,
- 1911,
- 1912,
- 143,
- 144,
- 145,
- 146,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1406,
- 143,
- 144,
- 145,
- 146,
- 1913,
- 1914,
- 1915,
- 1350,
- 1371,
- 1372,
- 97,
- 98,
- 1916,
- 1917,
- 1918,
- 115,
- 1919,
- 1920,
- 1920,
- 1505,
- 1507,
- 1506,
- 1921,
- 1064,
- 1065,
- 1922,
- 1923,
- 877,
- 1924,
- 1925,
- 1926,
- 1927,
- 1928,
- 1929,
- 1930,
- 1931,
- 1932,
- 1933,
- 1934,
- 1935,
- 1936,
- 1937,
- 1938,
- 1939,
- 1940,
- 1373,
- 1374,
- 1375,
- 1376,
- 144,
- 145,
- 146,
- 1805,
- 1806,
- 1807,
- 1941,
- 1942,
- 1943,
- 1447,
- 1427,
- 1428,
- 1429,
- 1492,
- 1493,
- 1494,
- ],
- "inlineDepth": Array [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ],
- "innerWindowID": Array [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ],
- "length": 2686,
- "line": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "nativeSymbol": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "originalLocation": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "subcategory": Array [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- null,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- null,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- null,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- null,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ],
- },
- "funcTable": Object {
- "columnNumber": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "isJS": Array [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- ],
- "length": 1944,
- "lineNumber": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "name": Array [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25,
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36,
- 37,
- 38,
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61,
- 62,
- 63,
- 64,
- 65,
- 66,
- 67,
- 68,
- 69,
- 70,
- 71,
- 72,
- 73,
- 74,
- 75,
- 76,
- 77,
- 78,
- 79,
- 80,
- 81,
- 82,
- 83,
- 84,
- 85,
- 86,
- 87,
- 88,
- 89,
- 90,
- 91,
- 92,
- 93,
- 94,
- 95,
- 96,
- 97,
- 98,
- 99,
- 100,
- 101,
- 102,
- 103,
- 104,
- 105,
- 106,
- 107,
- 108,
- 109,
- 110,
- 111,
- 112,
- 113,
- 114,
- 115,
- 116,
- 117,
- 118,
- 119,
- 120,
- 121,
- 122,
- 123,
- 124,
- 125,
- 126,
- 127,
- 128,
- 129,
- 130,
- 131,
- 132,
- 133,
- 134,
- 135,
- 136,
- 137,
- 138,
- 139,
- 140,
- 141,
- 142,
- 143,
- 144,
- 145,
- 146,
- 147,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 155,
- 156,
- 157,
- 158,
- 159,
- 160,
- 161,
- 162,
- 163,
- 164,
- 165,
- 166,
- 167,
- 168,
- 169,
- 170,
- 171,
- 172,
- 173,
- 174,
- 175,
- 176,
- 177,
- 178,
- 179,
- 180,
- 181,
- 182,
- 183,
- 184,
- 185,
- 186,
- 187,
- 188,
- 189,
- 190,
- 191,
- 192,
- 193,
- 194,
- 195,
- 196,
- 197,
- 198,
- 199,
- 200,
- 201,
- 202,
- 203,
- 204,
- 205,
- 206,
- 207,
- 208,
- 209,
- 210,
- 211,
- 212,
- 213,
- 214,
- 215,
- 216,
- 217,
- 218,
- 219,
- 220,
- 221,
- 222,
- 223,
- 224,
- 225,
- 226,
- 227,
- 228,
- 229,
- 230,
- 231,
- 232,
- 233,
- 234,
- 235,
- 236,
- 237,
- 238,
- 239,
- 240,
- 241,
- 242,
- 243,
- 244,
- 245,
- 246,
- 247,
- 248,
- 249,
- 250,
- 251,
- 252,
- 253,
- 254,
- 255,
- 256,
- 257,
- 258,
- 259,
- 260,
- 261,
- 262,
- 263,
- 264,
- 265,
- 266,
- 267,
- 268,
- 269,
- 270,
- 271,
- 272,
- 273,
- 274,
- 275,
- 276,
- 277,
- 278,
- 279,
- 280,
- 281,
- 282,
- 283,
- 284,
- 285,
- 286,
- 287,
- 288,
- 289,
- 290,
- 291,
- 292,
- 293,
- 294,
- 295,
- 296,
- 297,
- 298,
- 299,
- 300,
- 301,
- 302,
- 303,
- 304,
- 305,
- 306,
- 307,
- 308,
- 309,
- 310,
- 311,
- 312,
- 313,
- 314,
- 315,
- 316,
- 317,
- 318,
- 319,
- 320,
- 321,
- 322,
- 323,
- 324,
- 325,
- 326,
- 327,
- 328,
- 329,
- 330,
- 331,
- 332,
- 333,
- 334,
- 335,
- 336,
- 337,
- 338,
- 339,
- 340,
- 341,
- 342,
- 343,
- 344,
- 345,
- 346,
- 347,
- 348,
- 349,
- 350,
- 351,
- 352,
- 353,
- 354,
- 355,
- 356,
- 357,
- 358,
- 359,
- 360,
- 361,
- 362,
- 363,
- 364,
- 365,
- 366,
- 367,
- 368,
- 369,
- 370,
- 371,
- 372,
- 373,
- 374,
- 375,
- 376,
- 377,
- 378,
- 379,
- 380,
- 381,
- 382,
- 383,
- 384,
- 385,
- 386,
- 387,
- 388,
- 389,
- 390,
- 391,
- 392,
- 393,
- 394,
- 395,
- 396,
- 397,
- 398,
- 399,
- 400,
- 401,
- 402,
- 403,
- 404,
- 405,
- 406,
- 407,
- 408,
- 409,
- 410,
- 411,
- 412,
- 413,
- 414,
- 415,
- 416,
- 417,
- 418,
- 419,
- 420,
- 421,
- 422,
- 423,
- 424,
- 425,
- 426,
- 427,
- 428,
- 429,
- 430,
- 431,
- 432,
- 433,
- 434,
- 435,
- 436,
- 437,
- 438,
- 439,
- 440,
- 441,
- 442,
- 443,
- 444,
- 445,
- 446,
- 447,
- 448,
- 449,
- 450,
- 451,
- 452,
- 453,
- 454,
- 455,
- 456,
- 457,
- 458,
- 459,
- 460,
- 461,
- 462,
- 463,
- 464,
- 465,
- 466,
- 467,
- 468,
- 469,
- 470,
- 471,
- 472,
- 473,
- 474,
- 475,
- 476,
- 477,
- 478,
- 479,
- 480,
- 481,
- 482,
- 483,
- 484,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 499,
- 500,
- 501,
- 502,
- 503,
- 504,
- 505,
- 506,
- 507,
- 508,
- 509,
- 510,
- 511,
- 512,
- 513,
- 514,
- 515,
- 516,
- 517,
- 518,
- 519,
- 520,
- 521,
- 522,
- 523,
- 524,
- 525,
- 526,
- 527,
- 528,
- 529,
- 530,
- 531,
- 532,
- 533,
- 534,
- 535,
- 536,
- 537,
- 538,
- 539,
- 540,
- 541,
- 542,
- 543,
- 544,
- 545,
- 546,
- 547,
- 548,
- 549,
- 550,
- 551,
- 552,
- 553,
- 554,
- 555,
- 556,
- 557,
- 558,
- 559,
- 560,
- 561,
- 562,
- 563,
- 564,
- 565,
- 566,
- 567,
- 568,
- 569,
- 570,
- 571,
- 572,
- 573,
- 574,
- 575,
- 576,
- 577,
- 578,
- 579,
- 580,
- 581,
- 582,
- 583,
- 584,
- 585,
- 586,
- 587,
- 588,
- 589,
- 590,
- 591,
- 592,
- 593,
- 594,
- 595,
- 596,
- 597,
- 598,
- 599,
- 600,
- 601,
- 602,
- 603,
- 604,
- 605,
- 606,
- 607,
- 608,
- 609,
- 610,
- 611,
- 612,
- 613,
- 614,
- 615,
- 616,
- 617,
- 618,
- 619,
- 620,
- 621,
- 622,
- 623,
- 624,
- 625,
- 626,
- 627,
- 628,
- 629,
- 630,
- 631,
- 632,
- 633,
- 634,
- 635,
- 636,
- 637,
- 638,
- 639,
- 640,
- 641,
- 642,
- 643,
- 644,
- 645,
- 646,
- 647,
- 648,
- 649,
- 650,
- 651,
- 652,
- 653,
- 654,
- 655,
- 656,
- 657,
- 658,
- 659,
- 660,
- 661,
- 662,
- 663,
- 664,
- 665,
- 666,
- 667,
- 668,
- 669,
- 670,
- 671,
- 672,
- 673,
- 674,
- 675,
- 676,
- 677,
- 678,
- 679,
- 680,
- 681,
- 682,
- 683,
- 684,
- 685,
- 686,
- 687,
- 688,
- 689,
- 690,
- 691,
- 692,
- 693,
- 694,
- 695,
- 696,
- 697,
- 698,
- 699,
- 700,
- 701,
- 702,
- 703,
- 704,
- 705,
- 706,
- 707,
- 708,
- 709,
- 710,
- 711,
- 712,
- 713,
- 714,
- 715,
- 716,
- 717,
- 718,
- 719,
- 720,
- 721,
- 722,
- 723,
- 724,
- 725,
- 726,
- 727,
- 728,
- 729,
- 730,
- 731,
- 732,
- 733,
- 734,
- 735,
- 736,
- 737,
- 738,
- 739,
- 740,
- 741,
- 742,
- 743,
- 744,
- 745,
- 746,
- 747,
- 748,
- 749,
- 750,
- 751,
- 752,
- 753,
- 754,
- 755,
- 756,
- 757,
- 758,
- 759,
- 760,
- 761,
- 762,
- 763,
- 764,
- 765,
- 766,
- 767,
- 768,
- 769,
- 770,
- 771,
- 772,
- 773,
- 774,
- 775,
- 776,
- 777,
- 778,
- 779,
- 780,
- 781,
- 782,
- 783,
- 784,
- 785,
- 786,
- 787,
- 788,
- 789,
- 790,
- 791,
- 792,
- 793,
- 794,
- 795,
- 796,
- 797,
- 798,
- 799,
- 800,
- 801,
- 802,
- 803,
- 804,
- 805,
- 806,
- 807,
- 808,
- 809,
- 810,
- 811,
- 812,
- 813,
- 814,
- 815,
- 816,
- 817,
- 818,
- 819,
- 820,
- 821,
- 822,
- 823,
- 824,
- 825,
- 826,
- 827,
- 828,
- 829,
- 830,
- 831,
- 832,
- 833,
- 834,
- 835,
- 836,
- 837,
- 838,
- 839,
- 840,
- 841,
- 842,
- 843,
- 844,
- 845,
- 846,
- 847,
- 848,
- 849,
- 850,
- 851,
- 852,
- 853,
- 854,
- 855,
- 856,
- 857,
- 858,
- 859,
- 860,
- 861,
- 862,
- 863,
- 864,
- 865,
- 866,
- 867,
- 868,
- 869,
- 870,
- 871,
- 872,
- 873,
- 874,
- 875,
- 876,
- 877,
- 878,
- 879,
- 880,
- 881,
- 882,
- 883,
- 884,
- 885,
- 886,
- 887,
- 888,
- 889,
- 890,
- 891,
- 892,
- 893,
- 894,
- 895,
- 896,
- 897,
- 898,
- 899,
- 900,
- 901,
- 902,
- 903,
- 904,
- 905,
- 906,
- 907,
- 908,
- 909,
- 910,
- 911,
- 912,
- 913,
- 914,
- 915,
- 916,
- 917,
- 918,
- 919,
- 920,
- 921,
- 922,
- 923,
- 924,
- 925,
- 926,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 933,
- 934,
- 935,
- 936,
- 937,
- 938,
- 939,
- 940,
- 941,
- 942,
- 943,
- 944,
- 945,
- 946,
- 947,
- 948,
- 949,
- 950,
- 951,
- 952,
- 953,
- 954,
- 955,
- 956,
- 957,
- 958,
- 959,
- 960,
- 961,
- 962,
- 963,
- 964,
- 965,
- 966,
- 967,
- 968,
- 969,
- 970,
- 971,
- 972,
- 973,
- 974,
- 975,
- 976,
- 977,
- 978,
- 979,
- 980,
- 981,
- 982,
- 983,
- 984,
- 985,
- 986,
- 987,
- 988,
- 989,
- 990,
- 991,
- 992,
- 993,
- 994,
- 995,
- 996,
- 997,
- 998,
- 999,
- 1000,
- 1001,
- 1002,
- 1003,
- 1004,
- 1005,
- 1006,
- 1007,
- 1008,
- 1009,
- 1010,
- 1011,
- 1012,
- 1013,
- 1014,
- 1015,
- 1016,
- 1017,
- 1018,
- 1019,
- 1020,
- 1021,
- 1022,
- 1023,
- 1024,
- 1025,
- 1026,
- 1027,
- 1028,
- 1029,
- 1030,
- 1031,
- 1032,
- 1033,
- 1034,
- 1035,
- 1036,
- 1037,
- 1038,
- 1039,
- 1040,
- 1041,
- 1042,
- 1043,
- 1044,
- 1045,
- 1046,
- 1047,
- 1048,
- 1049,
- 1050,
- 1051,
- 1052,
- 1053,
- 1054,
- 1055,
- 1056,
- 1057,
- 1058,
- 1059,
- 1060,
- 1061,
- 1062,
- 1063,
- 1064,
- 1065,
- 1066,
- 1067,
- 1068,
- 1069,
- 1070,
- 1071,
- 1072,
- 1073,
- 1074,
- 1075,
- 1076,
- 1077,
- 1078,
- 1079,
- 1080,
- 1081,
- 1082,
- 1083,
- 1084,
- 1085,
- 1086,
- 1087,
- 1088,
- 1089,
- 1090,
- 1091,
- 1092,
- 1093,
- 1094,
- 1095,
- 1096,
- 1097,
- 1098,
- 1099,
- 1100,
- 1101,
- 1102,
- 1103,
- 1104,
- 1105,
- 1106,
- 1107,
- 1108,
- 1109,
- 1110,
- 1111,
- 1112,
- 1113,
- 1114,
- 1115,
- 1116,
- 1117,
- 1118,
- 1119,
- 1120,
- 1121,
- 1122,
- 1123,
- 1124,
- 1125,
- 1126,
- 1127,
- 1128,
- 1129,
- 1130,
- 1131,
- 1132,
- 1133,
- 1134,
- 1135,
- 1136,
- 1137,
- 1138,
- 1139,
- 1140,
- 1141,
- 1142,
- 1143,
- 1144,
- 1145,
- 1146,
- 1147,
- 1148,
- 1149,
- 1150,
- 1151,
- 1152,
- 1153,
- 1154,
- 1155,
- 1156,
- 1157,
- 1158,
- 1159,
- 1160,
- 1161,
- 1162,
- 1163,
- 1164,
- 1165,
- 1166,
- 1167,
- 1168,
- 1169,
- 1170,
- 1171,
- 1172,
- 1173,
- 1174,
- 1175,
- 1176,
- 1177,
- 1178,
- 1179,
- 1180,
- 1181,
- 1182,
- 1183,
- 1184,
- 1185,
- 1186,
- 1187,
- 1188,
- 1189,
- 1190,
- 1191,
- 1192,
- 1193,
- 1194,
- 1195,
- 1196,
- 1197,
- 1198,
- 1199,
- 1200,
- 1201,
- 1202,
- 1203,
- 1204,
- 1205,
- 1206,
- 1207,
- 1208,
- 1209,
- 1210,
- 1211,
- 1212,
- 1213,
- 1214,
- 1215,
- 1216,
- 1217,
- 1218,
- 1219,
- 1220,
- 1221,
- 1222,
- 1223,
- 1224,
- 1225,
- 1226,
- 1227,
- 1228,
- 1229,
- 1230,
- 1231,
- 1232,
- 1233,
- 1234,
- 1235,
- 1236,
- 1237,
- 1238,
- 1239,
- 1240,
- 1241,
- 1242,
- 1243,
- 1244,
- 1245,
- 1246,
- 1247,
- 1248,
- 1249,
- 1250,
- 1251,
- 1252,
- 1253,
- 1254,
- 1255,
- 1256,
- 1257,
- 1258,
- 1259,
- 1260,
- 1261,
- 1262,
- 1263,
- 1264,
- 1265,
- 1266,
- 1267,
- 1268,
- 1269,
- 1270,
- 1271,
- 1272,
- 1273,
- 1274,
- 1275,
- 1276,
- 1277,
- 1278,
- 1279,
- 1280,
- 1281,
- 1282,
- 1283,
- 1284,
- 1285,
- 1286,
- 1287,
- 1288,
- 1289,
- 1290,
- 1291,
- 1292,
- 1293,
- 1294,
- 1295,
- 1296,
- 1297,
- 1298,
- 1299,
- 1300,
- 1301,
- 1302,
- 1303,
- 1304,
- 1305,
- 1306,
- 1307,
- 1308,
- 1309,
- 1310,
- 1311,
- 1312,
- 1313,
- 1314,
- 1315,
- 1316,
- 1317,
- 1318,
- 1319,
- 1320,
- 1321,
- 1322,
- 1323,
- 1324,
- 1325,
- 1326,
- 1327,
- 1328,
- 1329,
- 1330,
- 1331,
- 1332,
- 1333,
- 1334,
- 1335,
- 1336,
- 1337,
- 1338,
- 1339,
- 1340,
- 1341,
- 1342,
- 1343,
- 1344,
- 1345,
- 1346,
- 1347,
- 1348,
- 1349,
- 1350,
- 1351,
- 1352,
- 1353,
- 1354,
- 1355,
- 1356,
- 1357,
- 1358,
- 1359,
- 1360,
- 1361,
- 1362,
- 1363,
- 1364,
- 1365,
- 1366,
- 1367,
- 1368,
- 1369,
- 1370,
- 1371,
- 1372,
- 1373,
- 1374,
- 1375,
- 1376,
- 1377,
- 1378,
- 1379,
- 1380,
- 1381,
- 1382,
- 1383,
- 1384,
- 1385,
- 1386,
- 1387,
- 1388,
- 1389,
- 1390,
- 1391,
- 1392,
- 1393,
- 1394,
- 1395,
- 1396,
- 1397,
- 1398,
- 1399,
- 1400,
- 1401,
- 1402,
- 1403,
- 1404,
- 1405,
- 1406,
- 1407,
- 1408,
- 1409,
- 1410,
- 1411,
- 1412,
- 1413,
- 1414,
- 1415,
- 1416,
- 1417,
- 1418,
- 1419,
- 1420,
- 1421,
- 1422,
- 1423,
- 1424,
- 1425,
- 1426,
- 1427,
- 1428,
- 1429,
- 1430,
- 1431,
- 1432,
- 1433,
- 1434,
- 1435,
- 1436,
- 1437,
- 1438,
- 1439,
- 1440,
- 1441,
- 1442,
- 1443,
- 1444,
- 1445,
- 1446,
- 1447,
- 1448,
- 1449,
- 1450,
- 1451,
- 1452,
- 1453,
- 1454,
- 1455,
- 1456,
- 1457,
- 1458,
- 1459,
- 1460,
- 1461,
- 1462,
- 1463,
- 1464,
- 1465,
- 1466,
- 1467,
- 1468,
- 1469,
- 1470,
- 1471,
- 1472,
- 1473,
- 1474,
- 1475,
- 1476,
- 1477,
- 1478,
- 1479,
- 1480,
- 1481,
- 1482,
- 1483,
- 1484,
- 1485,
- 1486,
- 1487,
- 1488,
- 1489,
- 1490,
- 1491,
- 1492,
- 1493,
- 1494,
- 1495,
- 1496,
- 1497,
- 1498,
- 1499,
- 1500,
- 1501,
- 1502,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1508,
- 1509,
- 1510,
- 1511,
- 1512,
- 1513,
- 1514,
- 1515,
- 1516,
- 1517,
- 1518,
- 1519,
- 1520,
- 1521,
- 1522,
- 1523,
- 1524,
- 1525,
- 1526,
- 1527,
- 1528,
- 1529,
- 1530,
- 1531,
- 1532,
- 1533,
- 1534,
- 1535,
- 1536,
- 1537,
- 1538,
- 1539,
- 1540,
- 1541,
- 1542,
- 1543,
- 1544,
- 1545,
- 1546,
- 1547,
- 1548,
- 1549,
- 1550,
- 1551,
- 1552,
- 1553,
- 1554,
- 1555,
- 1556,
- 1557,
- 1558,
- 1559,
- 1560,
- 1561,
- 1562,
- 1563,
- 1564,
- 1565,
- 1566,
- 1567,
- 1568,
- 1569,
- 1570,
- 1571,
- 1572,
- 1573,
- 1574,
- 1575,
- 1576,
- 1577,
- 1578,
- 1579,
- 1580,
- 1581,
- 1582,
- 1583,
- 1584,
- 1585,
- 1586,
- 1587,
- 1588,
- 1589,
- 1590,
- 1591,
- 1592,
- 1593,
- 1594,
- 1595,
- 1596,
- 1597,
- 1598,
- 1599,
- 1600,
- 1601,
- 1602,
- 1603,
- 1604,
- 1605,
- 1606,
- 1607,
- 1608,
- 1609,
- 1610,
- 1611,
- 1612,
- 1613,
- 1614,
- 1615,
- 1616,
- 1617,
- 1618,
- 1619,
- 1620,
- 1621,
- 1622,
- 1623,
- 1624,
- 1625,
- 1626,
- 1627,
- 1628,
- 1629,
- 1630,
- 1631,
- 1632,
- 1633,
- 1634,
- 1635,
- 1636,
- 1637,
- 1638,
- 1639,
- 1640,
- 1641,
- 1642,
- 1643,
- 1644,
- 1645,
- 1646,
- 1647,
- 1648,
- 1649,
- 1650,
- 1651,
- 1652,
- 1653,
- 1654,
- 1655,
- 1656,
- 1657,
- 1658,
- 1659,
- 1660,
- 1661,
- 1662,
- 1663,
- 1664,
- 1665,
- 1666,
- 1667,
- 1668,
- 1669,
- 1670,
- 1671,
- 1672,
- 1673,
- 1674,
- 1675,
- 1676,
- 1677,
- 1678,
- 1679,
- 1680,
- 1681,
- 1682,
- 1683,
- 1684,
- 1685,
- 1686,
- 1687,
- 1688,
- 1689,
- 1690,
- 1691,
- 1692,
- 1693,
- 1694,
- 1695,
- 1696,
- 1697,
- 1698,
- 1699,
- 1700,
- 1701,
- 1702,
- 1703,
- 1704,
- 1705,
- 1706,
- 1707,
- 1708,
- 1709,
- 1710,
- 1711,
- 1712,
- 1713,
- 1714,
- 1715,
- 1716,
- 1717,
- 1718,
- 1719,
- 1720,
- 1721,
- 1722,
- 1723,
- 1724,
- 1725,
- 1726,
- 1727,
- 1728,
- 1729,
- 1730,
- 1731,
- 1732,
- 1733,
- 1734,
- 1735,
- 1736,
- 1737,
- 1738,
- 1739,
- 1740,
- 1741,
- 1742,
- 1743,
- 1744,
- 1745,
- 1746,
- 1747,
- 1748,
- 1749,
- 1750,
- 1751,
- 1752,
- 1753,
- 1754,
- 1755,
- 1756,
- 1757,
- 1758,
- 1759,
- 1760,
- 1761,
- 1762,
- 1763,
- 1764,
- 1765,
- 1766,
- 1767,
- 1768,
- 1769,
- 1770,
- 1771,
- 1772,
- 1773,
- 1774,
- 1775,
- 1776,
- 1777,
- 1778,
- 1779,
- 1780,
- 1781,
- 1782,
- 1783,
- 1784,
- 1785,
- 1786,
- 1787,
- 1788,
- 1789,
- 1790,
- 1791,
- 1792,
- 1793,
- 1794,
- 1795,
- 1796,
- 1797,
- 1798,
- 1799,
- 1800,
- 1801,
- 1802,
- 1803,
- 1804,
- 1805,
- 1806,
- 1807,
- 1808,
- 1809,
- 1810,
- 1811,
- 1812,
- 1813,
- 1814,
- 1815,
- 1816,
- 1817,
- 1818,
- 1819,
- 1820,
- 1821,
- 1822,
- 1823,
- 1824,
- 1825,
- 1826,
- 1827,
- 1828,
- 1829,
- 1830,
- 1831,
- 1832,
- 1833,
- 1834,
- 1835,
- 1836,
- 1837,
- 1838,
- 1839,
- 1840,
- 1841,
- 1842,
- 1843,
- 1844,
- 1845,
- 1846,
- 1847,
- 1848,
- 1849,
- 1850,
- 1851,
- 1852,
- 1853,
- 1854,
- 1855,
- 1856,
- 1857,
- 1858,
- 1859,
- 1860,
- 1861,
- 1862,
- 1863,
- 1864,
- 1865,
- 1866,
- 1867,
- 1868,
- 1869,
- 1870,
- 1871,
- 1872,
- 1873,
- 1874,
- 1875,
- 1876,
- 1877,
- 1878,
- 1879,
- 1880,
- 1881,
- 1882,
- 1883,
- 1884,
- 1885,
- 1886,
- 1887,
- 1888,
- 1889,
- 1890,
- 1891,
- 1892,
- 1893,
- 1894,
- 1895,
- 1896,
- 1897,
- 1898,
- 1899,
- 1900,
- 1901,
- 1902,
- 1903,
- 1904,
- 1905,
- 1906,
- 1907,
- 1908,
- 1909,
- 1910,
- 1911,
- 1912,
- 1913,
- 1914,
- 1915,
- 1916,
- 1917,
- 1918,
- 1919,
- 1920,
- 1921,
- 1922,
- 1923,
- 1924,
- 1925,
- 1926,
- 1927,
- 1928,
- 1929,
- 1930,
- 1931,
- 1932,
- 1933,
- 1934,
- 1935,
- 1936,
- 1937,
- 1938,
- 1939,
- 1940,
- 1941,
- 1942,
- 1943,
- ],
- "originalLocation": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- "relevantForJS": Array [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- ],
- "resource": Array [
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- -1,
- ],
- "source": Array [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- ],
- },
- "nativeSymbols": Object {
- "address": Array [],
- "functionSize": Array [],
- "length": 0,
- "libIndex": Array [],
- "name": Array [],
- },
- "resourceTable": Object {
- "host": Array [],
- "length": 0,
- "lib": Array [],
- "name": Array [],
- "type": Array [],
- },
- "sourceLocationTable": Object {
- "column": Array [],
- "length": 0,
- "line": Array [],
- "source": Array [],
- },
- "sources": Object {
- "content": Array [],
- "filename": Array [],
- "id": Array [],
- "length": 0,
- "sourceMapURL": Array [],
- "startColumn": Array [],
- "startLine": Array [],
- },
- "stackTable": Object {
- "frame": Int32Array [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25,
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36,
- 37,
- 38,
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 2,
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61,
- 62,
- 63,
- 64,
- 65,
- 66,
- 67,
- 68,
- 69,
- 70,
- 71,
- 72,
- 73,
- 74,
- 75,
- 76,
- 77,
- 78,
- 79,
- 80,
- 81,
- 82,
- 83,
- 84,
- 85,
- 86,
- 87,
- 88,
- 89,
- 90,
- 91,
- 92,
- 93,
- 94,
- 95,
- 96,
- 97,
- 98,
- 99,
- 100,
- 80,
- 81,
- 101,
- 102,
- 103,
- 104,
- 105,
- 106,
- 107,
- 108,
- 109,
- 110,
- 111,
- 112,
- 113,
- 114,
- 115,
- 116,
- 117,
- 118,
- 119,
- 120,
- 121,
- 122,
- 123,
- 124,
- 125,
- 126,
- 127,
- 128,
- 129,
- 130,
- 131,
- 132,
- 133,
- 120,
- 134,
- 135,
- 120,
- 136,
- 137,
- 120,
- 138,
- 139,
- 140,
- 141,
- 142,
- 143,
- 144,
- 145,
- 146,
- 147,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 155,
- 156,
- 157,
- 158,
- 159,
- 160,
- 161,
- 162,
- 163,
- 164,
- 165,
- 166,
- 167,
- 168,
- 169,
- 170,
- 171,
- 172,
- 148,
- 149,
- 150,
- 173,
- 102,
- 103,
- 174,
- 175,
- 176,
- 177,
- 178,
- 179,
- 180,
- 181,
- 80,
- 81,
- 182,
- 183,
- 184,
- 80,
- 81,
- 185,
- 186,
- 47,
- 187,
- 188,
- 189,
- 190,
- 191,
- 192,
- 54,
- 55,
- 193,
- 194,
- 195,
- 196,
- 80,
- 81,
- 197,
- 198,
- 199,
- 200,
- 201,
- 202,
- 203,
- 204,
- 205,
- 80,
- 81,
- 206,
- 207,
- 208,
- 209,
- 210,
- 211,
- 212,
- 213,
- 214,
- 215,
- 216,
- 217,
- 218,
- 219,
- 220,
- 221,
- 222,
- 223,
- 224,
- 225,
- 226,
- 227,
- 228,
- 229,
- 230,
- 231,
- 232,
- 233,
- 234,
- 235,
- 236,
- 237,
- 238,
- 239,
- 240,
- 241,
- 242,
- 243,
- 244,
- 245,
- 246,
- 247,
- 248,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 249,
- 250,
- 251,
- 252,
- 253,
- 254,
- 255,
- 256,
- 257,
- 173,
- 102,
- 103,
- 258,
- 259,
- 174,
- 260,
- 224,
- 225,
- 226,
- 227,
- 261,
- 262,
- 263,
- 264,
- 265,
- 266,
- 267,
- 186,
- 268,
- 269,
- 270,
- 271,
- 272,
- 273,
- 274,
- 275,
- 276,
- 277,
- 278,
- 80,
- 81,
- 279,
- 280,
- 281,
- 282,
- 80,
- 81,
- 283,
- 284,
- 285,
- 286,
- 80,
- 81,
- 287,
- 288,
- 289,
- 290,
- 80,
- 81,
- 291,
- 292,
- 293,
- 294,
- 295,
- 296,
- 297,
- 298,
- 299,
- 300,
- 301,
- 302,
- 303,
- 304,
- 305,
- 306,
- 307,
- 308,
- 309,
- 310,
- 80,
- 81,
- 311,
- 312,
- 313,
- 314,
- 315,
- 316,
- 80,
- 81,
- 317,
- 318,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25,
- 319,
- 320,
- 321,
- 322,
- 323,
- 80,
- 81,
- 324,
- 325,
- 326,
- 327,
- 328,
- 329,
- 330,
- 331,
- 332,
- 333,
- 334,
- 335,
- 324,
- 325,
- 326,
- 327,
- 328,
- 336,
- 337,
- 338,
- 339,
- 340,
- 341,
- 342,
- 343,
- 342,
- 344,
- 345,
- 346,
- 347,
- 348,
- 349,
- 324,
- 325,
- 326,
- 341,
- 342,
- 327,
- 328,
- 329,
- 330,
- 331,
- 332,
- 350,
- 351,
- 352,
- 353,
- 354,
- 355,
- 356,
- 357,
- 125,
- 358,
- 359,
- 360,
- 361,
- 362,
- 363,
- 363,
- 364,
- 365,
- 366,
- 367,
- 368,
- 344,
- 369,
- 370,
- 371,
- 372,
- 373,
- 374,
- 367,
- 375,
- 376,
- 377,
- 378,
- 379,
- 380,
- 381,
- 382,
- 383,
- 384,
- 385,
- 386,
- 387,
- 388,
- 389,
- 390,
- 391,
- 392,
- 393,
- 394,
- 395,
- 396,
- 397,
- 398,
- 399,
- 400,
- 401,
- 376,
- 402,
- 385,
- 386,
- 387,
- 388,
- 114,
- 117,
- 403,
- 404,
- 120,
- 405,
- 406,
- 123,
- 124,
- 125,
- 126,
- 407,
- 408,
- 409,
- 410,
- 411,
- 412,
- 34,
- 35,
- 36,
- 37,
- 413,
- 414,
- 415,
- 416,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 2,
- 417,
- 418,
- 419,
- 420,
- 421,
- 422,
- 423,
- 424,
- 425,
- 426,
- 427,
- 428,
- 429,
- 350,
- 430,
- 427,
- 431,
- 432,
- 433,
- 434,
- 435,
- 436,
- 350,
- 389,
- 437,
- 438,
- 325,
- 326,
- 327,
- 328,
- 336,
- 381,
- 382,
- 341,
- 342,
- 327,
- 328,
- 336,
- 337,
- 338,
- 339,
- 340,
- 439,
- 440,
- 441,
- 442,
- 381,
- 382,
- 443,
- 341,
- 342,
- 327,
- 328,
- 329,
- 444,
- 445,
- 446,
- 447,
- 448,
- 449,
- 381,
- 382,
- 450,
- 451,
- 452,
- 453,
- 454,
- 455,
- 456,
- 457,
- 458,
- 459,
- 460,
- 461,
- 462,
- 463,
- 464,
- 465,
- 466,
- 467,
- 325,
- 326,
- 327,
- 328,
- 336,
- 381,
- 382,
- 468,
- 469,
- 470,
- 325,
- 326,
- 471,
- 472,
- 473,
- 474,
- 475,
- 476,
- 341,
- 342,
- 477,
- 478,
- 327,
- 328,
- 479,
- 480,
- 481,
- 482,
- 483,
- 484,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 499,
- 500,
- 501,
- 502,
- 503,
- 336,
- 381,
- 382,
- 504,
- 505,
- 506,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 507,
- 508,
- 509,
- 510,
- 511,
- 512,
- 483,
- 484,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 513,
- 514,
- 515,
- 516,
- 517,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 499,
- 500,
- 518,
- 519,
- 520,
- 521,
- 522,
- 523,
- 524,
- 525,
- 526,
- 527,
- 528,
- 529,
- 530,
- 531,
- 532,
- 533,
- 534,
- 535,
- 536,
- 537,
- 538,
- 539,
- 329,
- 330,
- 331,
- 540,
- 541,
- 366,
- 337,
- 338,
- 339,
- 340,
- 542,
- 543,
- 544,
- 545,
- 546,
- 547,
- 548,
- 549,
- 550,
- 551,
- 552,
- 553,
- 554,
- 555,
- 556,
- 557,
- 558,
- 559,
- 560,
- 561,
- 562,
- 563,
- 564,
- 565,
- 566,
- 567,
- 568,
- 569,
- 570,
- 489,
- 490,
- 491,
- 492,
- 493,
- 571,
- 572,
- 573,
- 120,
- 574,
- 575,
- 576,
- 577,
- 578,
- 579,
- 580,
- 581,
- 120,
- 582,
- 583,
- 584,
- 585,
- 586,
- 587,
- 588,
- 589,
- 590,
- 591,
- 224,
- 225,
- 226,
- 227,
- 228,
- 592,
- 593,
- 594,
- 231,
- 233,
- 234,
- 235,
- 236,
- 237,
- 595,
- 596,
- 597,
- 120,
- 598,
- 120,
- 599,
- 120,
- 600,
- 601,
- 602,
- 603,
- 604,
- 605,
- 224,
- 225,
- 226,
- 242,
- 243,
- 244,
- 245,
- 606,
- 607,
- 608,
- 609,
- 610,
- 324,
- 325,
- 326,
- 342,
- 341,
- 342,
- 327,
- 328,
- 479,
- 480,
- 611,
- 612,
- 613,
- 614,
- 548,
- 615,
- 616,
- 617,
- 618,
- 619,
- 620,
- 621,
- 186,
- 622,
- 623,
- 624,
- 625,
- 626,
- 627,
- 628,
- 629,
- 630,
- 631,
- 632,
- 633,
- 634,
- 80,
- 81,
- 635,
- 636,
- 637,
- 638,
- 639,
- 427,
- 428,
- 429,
- 350,
- 639,
- 640,
- 641,
- 642,
- 643,
- 644,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51,
- 2,
- 645,
- 646,
- 647,
- 648,
- 649,
- 650,
- 651,
- 652,
- 653,
- 654,
- 655,
- 656,
- 168,
- 657,
- 658,
- 659,
- 660,
- 661,
- 662,
- 663,
- 664,
- 224,
- 225,
- 226,
- 227,
- 228,
- 103,
- 665,
- 666,
- 667,
- 668,
- 226,
- 242,
- 243,
- 669,
- 670,
- 671,
- 672,
- 673,
- 674,
- 675,
- 676,
- 677,
- 427,
- 428,
- 429,
- 350,
- 678,
- 427,
- 428,
- 429,
- 350,
- 678,
- 43,
- 44,
- 45,
- 46,
- 679,
- 680,
- 681,
- 682,
- 683,
- 684,
- 685,
- 686,
- 687,
- 54,
- 55,
- 688,
- 689,
- 690,
- 691,
- 692,
- 693,
- 80,
- 81,
- 694,
- 695,
- 696,
- 697,
- 110,
- 111,
- 698,
- 699,
- 700,
- 701,
- 702,
- 703,
- 704,
- 705,
- 107,
- 108,
- 706,
- 110,
- 111,
- 698,
- 699,
- 700,
- 707,
- 708,
- 709,
- 710,
- 711,
- 712,
- 713,
- 714,
- 715,
- 716,
- 717,
- 718,
- 718,
- 718,
- 718,
- 718,
- 718,
- 718,
- 718,
- 719,
- 720,
- 721,
- 722,
- 723,
- 724,
- 725,
- 718,
- 718,
- 718,
- 718,
- 719,
- 726,
- 727,
- 728,
- 618,
- 729,
- 730,
- 731,
- 732,
- 733,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 739,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 734,
- 735,
- 732,
- 740,
- 741,
- 742,
- 743,
- 735,
- 732,
- 744,
- 732,
- 745,
- 746,
- 747,
- 748,
- 749,
- 750,
- 751,
- 752,
- 753,
- 754,
- 732,
- 736,
- 755,
- 738,
- 735,
- 732,
- 756,
- 757,
- 732,
- 734,
- 735,
- 732,
- 758,
- 759,
- 760,
- 761,
- 762,
- 763,
- 764,
- 765,
- 766,
- 767,
- 768,
- 769,
- 770,
- 771,
- 772,
- 773,
- 774,
- 775,
- 776,
- 777,
- 778,
- 779,
- 753,
- 754,
- 732,
- 736,
- 737,
- 732,
- 759,
- 780,
- 781,
- 760,
- 782,
- 783,
- 784,
- 785,
- 786,
- 787,
- 731,
- 732,
- 733,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 739,
- 734,
- 735,
- 732,
- 736,
- 737,
- 738,
- 735,
- 732,
- 734,
- 735,
- 732,
- 740,
- 788,
- 743,
- 735,
- 732,
- 744,
- 732,
- 745,
- 746,
- 747,
- 748,
- 770,
- 771,
- 772,
- 774,
- 775,
- 783,
- 784,
- 789,
- 790,
- 791,
- 792,
- 793,
- 794,
- 787,
- 785,
- 795,
- 796,
- 797,
- 798,
- 799,
- 800,
- 801,
- 802,
- 798,
- 799,
- 803,
- 804,
- 805,
- 798,
- 799,
- 801,
- 802,
- 798,
- 799,
- 803,
- 804,
- 805,
- 798,
- 799,
- 801,
- 802,
- 798,
- 799,
- 803,
- 804,
- 805,
- 798,
- 799,
- 801,
- 802,
- 798,
- 799,
- 806,
- 807,
- 798,
- 799,
- 808,
- 798,
- 799,
- 809,
- 799,
- 810,
- 811,
- 812,
- 813,
- 814,
- 815,
- 816,
- 817,
- 818,
- 819,
- 820,
- 821,
- 822,
- 823,
- 824,
- 825,
- 826,
- 827,
- 149,
- 150,
- 701,
- 828,
- 829,
- 702,
- 830,
- 831,
- 832,
- 833,
- 834,
- 835,
- 836,
- 837,
- 838,
- 839,
- 840,
- 841,
- 836,
- 839,
- 840,
- 841,
- 836,
- 839,
- 840,
- 841,
- 836,
- 839,
- 840,
- 841,
- 836,
- 839,
- 840,
- 841,
- 836,
- 839,
- 840,
- 841,
- 836,
- 842,
- 839,
- 843,
- 840,
- 841,
- 836,
- 839,
- 844,
- 840,
- 841,
- 836,
- 838,
- 839,
- 840,
- 841,
- 836,
- 845,
- 839,
- 840,
- 841,
- 836,
- 838,
- 846,
- 847,
- 848,
- 849,
- 850,
- 851,
- 852,
- 853,
- 854,
- 855,
- 856,
- 857,
- 858,
- 859,
- 858,
- 860,
- 861,
- 862,
- 863,
- 864,
- 865,
- 866,
- 867,
- 868,
- 869,
- 870,
- 871,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 872,
- 873,
- 874,
- 874,
- 875,
- 876,
- 877,
- 878,
- 879,
- 880,
- 881,
- 882,
- 883,
- 884,
- 885,
- 886,
- 887,
- 888,
- 889,
- 890,
- 891,
- 892,
- 893,
- 894,
- 895,
- 896,
- 897,
- 898,
- 899,
- 900,
- 901,
- 80,
- 81,
- 902,
- 903,
- 904,
- 905,
- 906,
- 907,
- 908,
- 909,
- 910,
- 911,
- 912,
- 913,
- 217,
- 914,
- 915,
- 916,
- 917,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 918,
- 916,
- 919,
- 920,
- 921,
- 922,
- 217,
- 923,
- 924,
- 925,
- 926,
- 927,
- 928,
- 929,
- 928,
- 929,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 933,
- 120,
- 934,
- 935,
- 936,
- 135,
- 120,
- 120,
- 937,
- 630,
- 631,
- 632,
- 633,
- 634,
- 80,
- 81,
- 938,
- 631,
- 632,
- 633,
- 634,
- 80,
- 81,
- 939,
- 940,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 941,
- 916,
- 942,
- 148,
- 149,
- 150,
- 943,
- 944,
- 248,
- 945,
- 913,
- 217,
- 914,
- 915,
- 916,
- 917,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 918,
- 916,
- 919,
- 920,
- 921,
- 922,
- 217,
- 923,
- 924,
- 925,
- 926,
- 927,
- 928,
- 929,
- 928,
- 929,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 946,
- 947,
- 948,
- 949,
- 939,
- 950,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 951,
- 952,
- 953,
- 954,
- 955,
- 956,
- 957,
- 120,
- 958,
- 959,
- 630,
- 631,
- 632,
- 633,
- 634,
- 80,
- 81,
- 960,
- 707,
- 961,
- 962,
- 963,
- 964,
- 965,
- 966,
- 967,
- 968,
- 969,
- 970,
- 971,
- 972,
- 973,
- 974,
- 975,
- 976,
- 977,
- 978,
- 927,
- 928,
- 929,
- 979,
- 980,
- 981,
- 982,
- 983,
- 984,
- 985,
- 986,
- 987,
- 988,
- 989,
- 990,
- 991,
- 992,
- 789,
- 790,
- 791,
- 878,
- 993,
- 994,
- 995,
- 996,
- 997,
- 998,
- 999,
- 1000,
- 1001,
- 1002,
- 1003,
- 1004,
- 1005,
- 913,
- 217,
- 1006,
- 915,
- 916,
- 917,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 1010,
- 1011,
- 1012,
- 1013,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 1014,
- 1015,
- 1016,
- 1017,
- 1018,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1019,
- 1020,
- 1021,
- 1022,
- 173,
- 102,
- 103,
- 174,
- 260,
- 224,
- 225,
- 226,
- 242,
- 243,
- 711,
- 712,
- 713,
- 1023,
- 1024,
- 1025,
- 245,
- 258,
- 1026,
- 245,
- 226,
- 227,
- 261,
- 1027,
- 1028,
- 264,
- 265,
- 1029,
- 84,
- 1030,
- 1031,
- 1032,
- 708,
- 709,
- 1033,
- 1034,
- 1035,
- 1036,
- 1037,
- 1038,
- 871,
- 1039,
- 1040,
- 1041,
- 217,
- 1042,
- 1043,
- 916,
- 1044,
- 148,
- 149,
- 150,
- 249,
- 250,
- 1045,
- 913,
- 217,
- 1046,
- 1047,
- 916,
- 1048,
- 922,
- 217,
- 1049,
- 1050,
- 1051,
- 1052,
- 1053,
- 1054,
- 1055,
- 1056,
- 1057,
- 1058,
- 1059,
- 916,
- 1060,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 1061,
- 913,
- 217,
- 1046,
- 1062,
- 1063,
- 916,
- 1064,
- 922,
- 217,
- 1049,
- 1065,
- 925,
- 926,
- 927,
- 928,
- 929,
- 928,
- 929,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 1066,
- 916,
- 1067,
- 920,
- 921,
- 922,
- 217,
- 1049,
- 1068,
- 1069,
- 916,
- 1070,
- 922,
- 217,
- 923,
- 1071,
- 925,
- 926,
- 927,
- 928,
- 929,
- 928,
- 929,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 935,
- 936,
- 938,
- 631,
- 632,
- 633,
- 634,
- 80,
- 81,
- 1072,
- 916,
- 1073,
- 148,
- 149,
- 150,
- 173,
- 102,
- 103,
- 174,
- 260,
- 263,
- 264,
- 265,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 1074,
- 913,
- 217,
- 1075,
- 1076,
- 916,
- 1077,
- 148,
- 149,
- 150,
- 173,
- 102,
- 103,
- 174,
- 260,
- 224,
- 225,
- 226,
- 227,
- 1078,
- 1079,
- 1080,
- 1081,
- 1082,
- 1083,
- 151,
- 152,
- 153,
- 154,
- 1084,
- 1085,
- 1086,
- 1087,
- 1088,
- 1089,
- 1090,
- 1091,
- 1092,
- 1093,
- 1094,
- 1095,
- 1096,
- 1097,
- 1098,
- 1099,
- 1100,
- 913,
- 217,
- 1042,
- 1101,
- 148,
- 149,
- 150,
- 226,
- 227,
- 228,
- 1102,
- 1103,
- 1104,
- 1014,
- 880,
- 1105,
- 1106,
- 1107,
- 1108,
- 1109,
- 1110,
- 1111,
- 1112,
- 913,
- 217,
- 1075,
- 1113,
- 1114,
- 916,
- 1115,
- 148,
- 149,
- 150,
- 173,
- 102,
- 103,
- 174,
- 260,
- 224,
- 225,
- 226,
- 227,
- 228,
- 1116,
- 1117,
- 151,
- 152,
- 153,
- 154,
- 1118,
- 974,
- 1119,
- 1120,
- 1121,
- 913,
- 217,
- 1046,
- 1122,
- 1123,
- 916,
- 1124,
- 1125,
- 1126,
- 1127,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 1128,
- 962,
- 963,
- 964,
- 965,
- 966,
- 967,
- 968,
- 1129,
- 1130,
- 1131,
- 1132,
- 966,
- 967,
- 968,
- 1129,
- 787,
- 791,
- 1133,
- 1134,
- 807,
- 1135,
- 1136,
- 1137,
- 1138,
- 1139,
- 1140,
- 1141,
- 1142,
- 1143,
- 84,
- 1030,
- 1031,
- 1032,
- 1144,
- 1145,
- 1146,
- 710,
- 1014,
- 1147,
- 1148,
- 1149,
- 1150,
- 1151,
- 1152,
- 539,
- 1153,
- 1154,
- 1155,
- 1156,
- 995,
- 996,
- 1097,
- 1098,
- 1157,
- 1158,
- 1159,
- 1160,
- 1161,
- 1162,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 1163,
- 1164,
- 1165,
- 1166,
- 1167,
- 1168,
- 1169,
- 1170,
- 1171,
- 1172,
- 1173,
- 1174,
- 1175,
- 1176,
- 1069,
- 916,
- 1070,
- 922,
- 217,
- 923,
- 1071,
- 925,
- 926,
- 927,
- 928,
- 929,
- 928,
- 929,
- 927,
- 928,
- 929,
- 930,
- 931,
- 932,
- 1007,
- 1008,
- 1009,
- 80,
- 81,
- 148,
- 149,
- 150,
- 151,
- 152,
- 153,
- 154,
- 1177,
- 1178,
- 1179,
- 1180,
- 1181,
- 1182,
- 1183,
- 1184,
- 1185,
- 1182,
- 1186,
- 1183,
- 1187,
- 1184,
- 1185,
- 1182,
- 1188,
- 1189,
- 1190,
- 1191,
- 1192,
- 1193,
- 1194,
- 1195,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1198,
- 1199,
- 1200,
- 751,
- 1201,
- 1202,
- 1203,
- 1204,
- 1205,
- 1206,
- 1207,
- 1208,
- 324,
- 325,
- 326,
- 327,
- 328,
- 336,
- 381,
- 382,
- 1209,
- 1210,
- 1211,
- 1212,
- 1213,
- 341,
- 342,
- 327,
- 328,
- 336,
- 337,
- 338,
- 339,
- 340,
- 381,
- 382,
- 1214,
- 1215,
- 1216,
- 1217,
- 732,
- 1218,
- 734,
- 735,
- 732,
- 1219,
- 1220,
- 1221,
- 1222,
- 1223,
- 1224,
- 1225,
- 1226,
- 1227,
- 1228,
- 1229,
- 1230,
- 1231,
- 1232,
- 1233,
- 1234,
- 1235,
- 1236,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 499,
- 500,
- 501,
- 502,
- 503,
- 1237,
- 1235,
- 1236,
- 485,
- 486,
- 487,
- 1238,
- 1239,
- 325,
- 326,
- 327,
- 328,
- 1240,
- 1241,
- 336,
- 337,
- 338,
- 339,
- 340,
- 341,
- 342,
- 327,
- 328,
- 479,
- 480,
- 611,
- 612,
- 613,
- 614,
- 548,
- 1242,
- 1243,
- 1244,
- 1245,
- 1246,
- 507,
- 508,
- 509,
- 1247,
- 1248,
- 1236,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 1249,
- 1250,
- 1251,
- 1252,
- 1253,
- 1254,
- 1255,
- 617,
- 1256,
- 474,
- 475,
- 476,
- 1256,
- 474,
- 475,
- 476,
- 329,
- 330,
- 1257,
- 1258,
- 331,
- 332,
- 1259,
- 1260,
- 732,
- 736,
- 755,
- 738,
- 735,
- 732,
- 758,
- 759,
- 760,
- 761,
- 762,
- 763,
- 764,
- 765,
- 766,
- 767,
- 768,
- 769,
- 1261,
- 1262,
- 1263,
- 1264,
- 336,
- 381,
- 382,
- 482,
- 483,
- 484,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 1265,
- 1266,
- 1267,
- 566,
- 1268,
- 1204,
- 1269,
- 1012,
- 135,
- 120,
- 745,
- 746,
- 747,
- 748,
- 770,
- 771,
- 772,
- 774,
- 775,
- 776,
- 777,
- 778,
- 1270,
- 1271,
- 1017,
- 1272,
- 1273,
- 507,
- 508,
- 509,
- 1274,
- 1275,
- 1276,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 513,
- 514,
- 515,
- 516,
- 517,
- 492,
- 493,
- 1277,
- 1278,
- 1279,
- 1280,
- 1281,
- 1282,
- 1283,
- 1248,
- 1236,
- 485,
- 486,
- 487,
- 488,
- 489,
- 490,
- 491,
- 492,
- 493,
- 494,
- 495,
- 496,
- 497,
- 498,
- 499,
- 500,
- 501,
- 502,
- 503,
- 1204,
- 1284,
- 1285,
- 1286,
- 1287,
- 1288,
- 1289,
- 1290,
- 1291,
- 878,
- 1292,
- 1256,
- 474,
- 475,
- 476,
- 1293,
- 1294,
- 1295,
- 1296,
- 1297,
- 1298,
- 58,
- 59,
- 93,
- 1299,
- 1300,
- 1301,
- 1302,
- 80,
- 81,
- 1303,
- 1304,
- 719,
- 1091,
- 1305,
- 1306,
- 734,
- 735,
- 732,
- 734,
- 735,
- 732,
- 1218,
- 734,
- 735,
- 732,
- 1219,
- 1220,
- 1221,
- 1222,
- 1223,
- 1307,
- 1308,
- 1309,
- 1310,
- 1311,
- 1312,
- 1313,
- 1314,
- 1315,
- 1316,
- 734,
- 735,
- 732,
- 734,
- 735,
- 732,
- 1218,
- 734,
- 735,
- 732,
- 1219,
- 1220,
- 1221,
- 1317,
- 1318,
- 1319,
- 1310,
- 1320,
- 1311,
- 1312,
- 1313,
- 1321,
- 1322,
- 1323,
- 1324,
- 1325,
- 1326,
- 1327,
- 1328,
- 1329,
- 1330,
- 1331,
- 1332,
- 839,
- 840,
- 841,
- 836,
- 838,
- 839,
- 840,
- 841,
- 836,
- 838,
- 839,
- 840,
- 841,
- 836,
- 839,
- 1333,
- 840,
- 841,
- 836,
- 838,
- 839,
- 840,
- 841,
- 836,
- 838,
- 1334,
- 1335,
- 1336,
- 1337,
- 836,
- 1338,
- 1339,
- 836,
- 1338,
- 1339,
- 836,
- 1338,
- 1339,
- 836,
- 1338,
- 1339,
- 836,
- 838,
- 839,
- 840,
- 841,
- 836,
- 1340,
- 838,
- 1341,
- 1342,
- 1334,
- 1335,
- 1343,
- 1344,
- 1345,
- 1337,
- 891,
- 892,
- 1346,
- 1347,
- 1348,
- 1349,
- 1291,
- 878,
- 801,
- 802,
- 798,
- 799,
- 801,
- 802,
- 798,
- 799,
- 801,
- 802,
- 798,
- 799,
- 1219,
- 1220,
- 1221,
- 1317,
- 1318,
- 1319,
- 1350,
- 1222,
- 1223,
- 1289,
- 1290,
- 1351,
- 1315,
- 1352,
- 1353,
- 1354,
- 1220,
- 1221,
- 1317,
- 1355,
- 1356,
- 1315,
- 1316,
- 1222,
- 1223,
- 1260,
- 1357,
- 1358,
- 891,
- 892,
- 1359,
- 1360,
- 1361,
- 1362,
- 1363,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1197,
- 1196,
- 1364,
- 1365,
- 1366,
- 1367,
- 1303,
- 1368,
- 1369,
- 114,
- 117,
- 1370,
- 1371,
- 1372,
- 224,
- 225,
- 226,
- 227,
- 228,
- 103,
- 1373,
- 1374,
- 1375,
- 1376,
- 1377,
- 1378,
- 1379,
- 1380,
- 1381,
- 1382,
- 1383,
- 1384,
- 1385,
- 1386,
- 895,
- 896,
- 897,
- 898,
- 899,
- 900,
- 1387,
- 1388,
- 1389,
- 901,
- 80,
- 81,
- 1390,
- 1391,
- 1392,
- 1393,
- 1394,
- 1395,
- 125,
- 126,
- 407,
- 1396,
- 1397,
- 1398,
- 1399,
- 1400,
- 1401,
- 1402,
- 1303,
- 1403,
- 1404,
- 1405,
- 1406,
- 1407,
- 1408,
- 1409,
- 1410,
- 1411,
- 1412,
- 1413,
- 1414,
- 120,
- 1415,
- 1416,
- 1417,
- 1418,
- 125,
- 126,
- 407,
- 1396,
- 1397,
- 1398,
- 1399,
- 1419,
- 1420,
- 1421,
- 120,
- 1422,
- 1423,
- 1417,
- 1418,
- 125,
- 126,
- 407,
- 1424,
- 1425,
- 1426,
- 120,
- 1427,
- 1428,
- 1417,
- 1418,
- 125,
- 126,
- 407,
- 1424,
- 1425,
- 1429,
- 1430,
- 1431,
- 1359,
- 1359,
- 1359,
- 1359,
- 1359,
- 1359,
- 1359,
- 1359,
- 1359,
- 1360,
- 1432,
- 1091,
- 1092,
- 1093,
- 1433,
- 1434,
- 1435,
- 1436,
- 1437,
- 1438,
- 1439,
- 1440,
- 1441,
- 1442,
- 1443,
- 1444,
- 1445,
- 1446,
- 1447,
- 1448,
- 1449,
- 1450,
- 1451,
- 1452,
- 1453,
- 1454,
- 1455,
- 1456,
- 1457,
- 1458,
- 1459,
- 1460,
- 1461,
- 1462,
- 1463,
- 1464,
- 1465,
- 1466,
- 1467,
- 1468,
- 1469,
- 1470,
- 1471,
- 1472,
- 1473,
- 1474,
- 1475,
- 1476,
- 1477,
- 1478,
- 1479,
- 1480,
- 1481,
- 1482,
- 1483,
- 1484,
- 1485,
- 1486,
- 1487,
- 1488,
- 1489,
- 1490,
- 1491,
- 1492,
- 1493,
- 1494,
- 1495,
- 1496,
- 1497,
- 1498,
- 1499,
- 1500,
- 1501,
- 1502,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1508,
- 1509,
- 1510,
- 1511,
- 1512,
- 1513,
- 1514,
- 1515,
- 1516,
- 1517,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1518,
- 1519,
- 1503,
- 1504,
- 1520,
- 1521,
- 1522,
- 1523,
- 1524,
- 1525,
- 1505,
- 1506,
- 1507,
- 1526,
- 1527,
- 1528,
- 1529,
- 1530,
- 1531,
- 1532,
- 1533,
- 1534,
- 1535,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1536,
- 1537,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1538,
- 1539,
- 1503,
- 1504,
- 1505,
- 1540,
- 1541,
- 1542,
- 1543,
- 1544,
- 1501,
- 1502,
- 1503,
- 1504,
- 1505,
- 1506,
- 1507,
- 1545,
- 1546,
- 1547,
- 1548,
- 1549,
- 1550,
- 1551,
- 1552,
- 1553,
- 1554,
- 1555,
- 1556,
- 1557,
- 1558,
- 1559,
- 1560,
- 1561,
- 1562,
- 1563,
- 1564,
- 1565,
- 1566,
- 1567,
- 1568,
- 1569,
- 1570,
- 1571,
- 1549,
- 1572,
- 1573,
- 1574,
- 1575,
- 1576,
- 1577,
- 1578,
- 1579,
- 1580,
- 1581,
- 1582,
- 1583,
- 1584,
- 1585,
- 1586,
- 1587,
- 1588,
- 1589,
- 1590,
- 1591,
- 1592,
- 1593,
- 1594,
- 1595,
- 1596,
- 1597,
- 1598,
- 1599,
- 1600,
- 1601,
- 1602,
- 1603,
- 1604,
- 1605,
- 1606,
- 1607,
- 1608,
- 1609,
- 1610,
- 1611,
- 1612,
- 1577,
- 1578,
- 1579,
- 1580,
- 1581,
- 1582,
- 1583,
- 1613,
- 1614,
- 1615,
- 1616,
- 1617,
- 1618,
- 1619,
- 1620,
- 1621,
- 1622,
- 1623,
- 1624,
- 1625,
- 1626,
- 1627,
- 1628,
- 1629,
- 1630,
- 1631,
- 1632,
- 1617,
- 1633,
- 1634,
- 1635,
- 1636,
- 1637,
- 1638,
- 1639,
- 1640,
- 1641,
- 1642,
- 1643,
- 1644,
- 1645,
- 1646,
- 1647,
- 1648,
- 1649,
- 1650,
- 1651,
- 1652,
- 1653,
- 1654,
- 1655,
- 1656,
- 1657,
- 1658,
- 1659,
- 1660,
- 1661,
- 1662,
- 1663,
- 1664,
- 1665,
- 1666,
- 1667,
- 1668,
- 1669,
- 1670,
- 1671,
- 1672,
- 1673,
- 1674,
- 1675,
- 1676,
- 1677,
- 1676,
- 1677,
- 1678,
- 1679,
- 1680,
- 1681,
- 1682,
- 1683,
- 1684,
- 1685,
- 1686,
- 1687,
- 1688,
- 1689,
- 1690,
- 1691,
- 1692,
- 1693,
- 1694,
- 1695,
- 1696,
- 1697,
- 1698,
- 1699,
- 1700,
- 1701,
- 1702,
- 1703,
- 1704,
- 1705,
- 1706,
- 1707,
- 1708,
- 1709,
- 1710,
- 1711,
- 1712,
- 1713,
- 1714,
- 1715,
- 1714,
- 1716,
- 1714,
- 1715,
- 1714,
- 1715,
- 1717,
- 1718,
- 1719,
- 1720,
- 1721,
- 1722,
- 1723,
- 1724,
- 1725,
- 1726,
- 1727,
- 1728,
- 1729,
- 1730,
- 1731,
- 1732,
- 1733,
- 1734,
- 1735,
- 1736,
- 1737,
- 1738,
- 1739,
- 1740,
- 1741,
- 1742,
- 1743,
- 1744,
- 1745,
- 1746,
- 1747,
- 1748,
- 1749,
- 1750,
- 1751,
- 1752,
- 1753,
- 1754,
- 1755,
- 1756,
- 1757,
- 1758,
- 1759,
- 1760,
- 1761,
- 1762,
- 1763,
- 1764,
- 1765,
- 1766,
- 1767,
- 1768,
- 1769,
- 1770,
- 1771,
- 1772,
- 1773,
- 1774,
- 1775,
- 1776,
- 1777,
- 1778,
- 1779,
- 1780,
- 1781,
- 1782,
- 1783,
- 1784,
- 1785,
- 1782,
- 1783,
- 1784,
- 1786,
- 1787,
- 1788,
- 1789,
- 1790,
- 1791,
- 1792,
- 1793,
- 1794,
- 1795,
- 1796,
- 1797,
- 1798,
- 1799,
- 1800,
- 1801,
- 1802,
- 1803,
- 1804,
- 1805,
- 1806,
- 1807,
- 1808,
- 1809,
- 1810,
- 1811,
- 1812,
- 1813,
- 1814,
- 1815,
- 1816,
- 1817,
- 1818,
- 1819,
- 1820,
- 1821,
- 1822,
- 1823,
- 1824,
- 1825,
- 1826,
- 1827,
- 1828,
- 1829,
- 1830,
- 1831,
- 1832,
- 1833,
- 1834,
- 1835,
- 1836,
- 1837,
- 1838,
- 1839,
- 1840,
- 1841,
- 1842,
- 1843,
- 1844,
- 1845,
- 1846,
- 1847,
- 1842,
- 1848,
- 1849,
- 1842,
- 1850,
- 1851,
- 1852,
- 1853,
- 1854,
- 1855,
- 1856,
- 1857,
- 1858,
- 1859,
- 1860,
- 1861,
- 1862,
- 1863,
- 1864,
- 1865,
- 1866,
- 1867,
- 1868,
- 1869,
- 1870,
- 1871,
- 1872,
- 1873,
- 1874,
- 1875,
- 1860,
- 1861,
- 1862,
- 1863,
- 1864,
- 1865,
- 1866,
- 1867,
- 1868,
- 1869,
- 1876,
- 1877,
- 1878,
- 1879,
- 1880,
- 1881,
- 1842,
- 1882,
- 1883,
- 1884,
- 1885,
- 1886,
- 1887,
- 1888,
- 1889,
- 1890,
- 1891,
- 1892,
- 1893,
- 1894,
- 1895,
- 1860,
- 1861,
- 1862,
- 1863,
- 1896,
- 1897,
- 1898,
- 1860,
- 1861,
- 1899,
- 1900,
- 1901,
- 1902,
- 1903,
- 1904,
- 1905,
- 1906,
- 1907,
- 1908,
- 1909,
- 1833,
- 1834,
- 1835,
- 1910,
- 1911,
- 1912,
- 1913,
- 1914,
- 1915,
- 1916,
- 1917,
- 1918,
- 1919,
- 1920,
- 1921,
- 1922,
- 1923,
- 1924,
- 1925,
- 1926,
- 1927,
- 1928,
- 1929,
- 1930,
- 1931,
- 1932,
- 1933,
- 1934,
- 1935,
- 1936,
- 1937,
- 1938,
- 1939,
- 1940,
- 1941,
- 1942,
- 1943,
- 1944,
- 1945,
- 1946,
- 1947,
- 1948,
- 1949,
- 1950,
- 1951,
- 1952,
- 1953,
- 1954,
- 1955,
- 1956,
- 1957,
- 1958,
- 1959,
- 1960,
- 1961,
- 1962,
- 1963,
- 1932,
- 1933,
- 1964,
- 1965,
- 1960,
- 1961,
- 1962,
- 1966,
- 1967,
- 1968,
- 1969,
- 1970,
- 1971,
- 1972,
- 1973,
- 1938,
- 1974,
- 1975,
- 1976,
- 1977,
- 1978,
- 1979,
- 1980,
- 1981,
- 1982,
- 1983,
- 1984,
- 1985,
- 1986,
- 1987,
- 1988,
- 1977,
- 1989,
- 1990,
- 1991,
- 1977,
- 1992,
- 1993,
- 1994,
- 1995,
- 1996,
- 1997,
- 1998,
- 1982,
- 1983,
- 1984,
- 1985,
- 1999,
- 2000,
- 2001,
- 1971,
- 1972,
- 2002,
- 2003,
- 2004,
- 2005,
- 2006,
- 2007,
- 2008,
- 2009,
- 2010,
- 2011,
- 2012,
- 2013,
- 2014,
- 2015,
- 2016,
- 2017,
- 2018,
- 1973,
- 1938,
- 2019,
- 2020,
- 1987,
- 1998,
- 1982,
- 1983,
- 1984,
- 1985,
- 1999,
- 2021,
- 2022,
- 2023,
- 2024,
- 2025,
- 2026,
- 2027,
- 2028,
- 2029,
- 2030,
- 2031,
- 2032,
- 2033,
- 2034,
- 1941,
- 1942,
- 1943,
- 1944,
- 2035,
- 2036,
- 2037,
- 2038,
- 2039,
- 2040,
- 2041,
- 1973,
- 1938,
- 2042,
- 2043,
- 2044,
- 2045,
- 2046,
- 2047,
- 2048,
- 2049,
- 1982,
- 1983,
- 2050,
- 2051,
- 1984,
- 1985,
- 1999,
- 2052,
- 2053,
- 2054,
- 2055,
- 2056,
- 2057,
- 2058,
- 2057,
- 2056,
- 2059,
- 2060,
- 2061,
- 2062,
- 2063,
- 2064,
- 2065,
- 2066,
- 2067,
- 2068,
- 2069,
- 2070,
- 2071,
- 2072,
- 2073,
- 2074,
- 2075,
- 2076,
- 2077,
- 2078,
- 2079,
- 2080,
- 2081,
- 2082,
- 2062,
- 2063,
- 2083,
- 2084,
- 2085,
- 2086,
- 2087,
- 2088,
- 2089,
- 2090,
- 2091,
- 2092,
- 2093,
- 2094,
- 2095,
- 2096,
- 2097,
- 2098,
- 2099,
- 2100,
- 2101,
- 2102,
- 2103,
- 2104,
- 2105,
- 2106,
- 2107,
- 2108,
- 2109,
- 2110,
- 2111,
- 2112,
- 2113,
- 2114,
- 2115,
- 2105,
- 2116,
- 2117,
- 2118,
- 2119,
- 2120,
- 2121,
- 2089,
- 2122,
- 2123,
- 2124,
- 2125,
- 2126,
- 2127,
- 2128,
- 2111,
- 2112,
- 2129,
- 2130,
- 2131,
- 2132,
- 2133,
- 2130,
- 2134,
- 2135,
- 2136,
- 2137,
- 2138,
- 2139,
- 2105,
- 2134,
- 2135,
- 2136,
- 2140,
- 2141,
- 2142,
- 2143,
- 2144,
- 2145,
- 2146,
- 2147,
- 2148,
- 2149,
- 2150,
- 2151,
- 2119,
- 2152,
- 2119,
- 2153,
- 2154,
- 2119,
- 2105,
- 2155,
- 2156,
- 2157,
- 2147,
- 2158,
- 2159,
- 2160,
- 2161,
- 2162,
- 2163,
- 2164,
- 2165,
- 2166,
- 2167,
- 2168,
- 2169,
- 2170,
- 2171,
- 2172,
- 2173,
- 2174,
- 2175,
- 2176,
- 2177,
- 2178,
- 2179,
- 2180,
- 2181,
- 2182,
- 2183,
- 2184,
- 2185,
- 2186,
- 2187,
- 2188,
- 2189,
- 2190,
- 2191,
- 2192,
- 2193,
- 2194,
- 2195,
- 2196,
- 2197,
- 2198,
- 2199,
- 2200,
- 2201,
- 2202,
- 2203,
- 2204,
- 2205,
- 2206,
- 2207,
- 2208,
- 2209,
- 2210,
- 2211,
- 2212,
- 2213,
- 2214,
- 2215,
- 2216,
- 2217,
- 2218,
- 2219,
- 2220,
- 2221,
- 2222,
- 2223,
- 2224,
- 2225,
- 2226,
- 2227,
- 2228,
- 2229,
- 2230,
- 2231,
- 2232,
- 2233,
- 2234,
- 2235,
- 2236,
- 2237,
- 2238,
- 2239,
- 2240,
- 2241,
- 2242,
- 2243,
- 2244,
- 2245,
- 2246,
- 2247,
- 2248,
- 2249,
- 2250,
- 2251,
- 2252,
- 2253,
- 2254,
- 2255,
- 2256,
- 2257,
- 2258,
- 2259,
- 2260,
- 2261,
- 2262,
- 2263,
- 2264,
- 2265,
- 2266,
- 2267,
- 2268,
- 2269,
- 2270,
- 2271,
- 2272,
- 2273,
- 2274,
- 2275,
- 2271,
- 2272,
- 2264,
- 2265,
- 2266,
- 2267,
- 2273,
- 2274,
- 2275,
- 2271,
- 2272,
- 2276,
- 2277,
- 2278,
- 2279,
- 2280,
- 2281,
- 2282,
- 2283,
- 2284,
- 2285,
- 2286,
- 2287,
- 2288,
- 2289,
- 2290,
- 2291,
- 2292,
- 2293,
- 2294,
- 2295,
- 2296,
- 2297,
- 2298,
- 2299,
- 2300,
- 2301,
- 2302,
- 2303,
- 2304,
- 2305,
- 2306,
- 2307,
- 2308,
- 2309,
- 2310,
- 2311,
- 2312,
- 2313,
- 2314,
- 2315,
- 2316,
- 2317,
- 2318,
- 2319,
- 2320,
- 2321,
- 2322,
- 2323,
- 2324,
- 2325,
- 2326,
- 2327,
- 2328,
- 2329,
- 2330,
- 2331,
- 2331,
- 2332,
- 2333,
- 2334,
- 2335,
- 2329,
- 2330,
- 2336,
- 2337,
- 2338,
- 2339,
- 2340,
- 2331,
- 2331,
- 2332,
- 2341,
- 2342,
- 2329,
- 2330,
- 2343,
- 2344,
- 2345,
- 2346,
- 2347,
- 2348,
- 2349,
- 2338,
- 2339,
- 2350,
- 2351,
- 2352,
- 2353,
- 2354,
- 2355,
- 2329,
- 2330,
- 2331,
- 2331,
- 2332,
- 2356,
- 2357,
- 2358,
- 2359,
- 2360,
- 2361,
- 2360,
- 2362,
- 2358,
- 2363,
- 2364,
- 2353,
- 2354,
- 2365,
- 2366,
- 2367,
- 2368,
- 2358,
- 2369,
- 2359,
- 2370,
- 2368,
- 2358,
- 2369,
- 2359,
- 2370,
- 2371,
- 2358,
- 2369,
- 2359,
- 2370,
- 2372,
- 2373,
- 2374,
- 2353,
- 2354,
- 2357,
- 2358,
- 2369,
- 2359,
- 2375,
- 2376,
- 2357,
- 2358,
- 2369,
- 2359,
- 2377,
- 2378,
- 2329,
- 2330,
- 2336,
- 2337,
- 2338,
- 2339,
- 2340,
- 2379,
- 2374,
- 2353,
- 2357,
- 2358,
- 2369,
- 2341,
- 2356,
- 2354,
- 2380,
- 2367,
- 2371,
- 2358,
- 2369,
- 2359,
- 2370,
- 2374,
- 2353,
- 2357,
- 2358,
- 2369,
- 2359,
- 2357,
- 2358,
- 2369,
- 2363,
- 2381,
- 2362,
- 2358,
- 2369,
- 2359,
- 2370,
- 2357,
- 2358,
- 2369,
- 2363,
- 2357,
- 2358,
- 2369,
- 2359,
- 2370,
- 2382,
- 2383,
- 2370,
- 2357,
- 2358,
- 2369,
- 2363,
- 2359,
- 2384,
- 2385,
- 2386,
- 2329,
- 2330,
- 2331,
- 2387,
- 2388,
- 2352,
- 2353,
- 2368,
- 2358,
- 2369,
- 2359,
- 2370,
- 2389,
- 2353,
- 2354,
- 2390,
- 2371,
- 2358,
- 2369,
- 2391,
- 2357,
- 2358,
- 2369,
- 2359,
- 2370,
- 2352,
- 2353,
- 2368,
- 2358,
- 2369,
- 2363,
- 2357,
- 2358,
- 2369,
- 2363,
- 2356,
- 2357,
- 2358,
- 2369,
- 2359,
- 2368,
- 2358,
- 2369,
- 2359,
- 2370,
- 2351,
- 2352,
- 2353,
- 2354,
- 2357,
- 2358,
- 2369,
- 2363,
- 2392,
- 2393,
- 2394,
- 2352,
- 2353,
- 2368,
- 2358,
- 2359,
- 2381,
- 2395,
- 2396,
- 2397,
- 2398,
- 2399,
- 2400,
- 2363,
- 2363,
- 2401,
- 2402,
- 2403,
- 2404,
- 2405,
- 2406,
- 2407,
- 2408,
- 2409,
- 2410,
- 2411,
- 2412,
- 2413,
- 2414,
- 2415,
- 2416,
- 2417,
- 2418,
- 2419,
- 2420,
- 2421,
- 2422,
- 2423,
- 2424,
- 2425,
- 2426,
- 2427,
- 2428,
- 2429,
- 2430,
- 2431,
- 2432,
- 2433,
- 2434,
- 2435,
- 2436,
- 2415,
- 2437,
- 2438,
- 2439,
- 2440,
- 2441,
- 2442,
- 2443,
- 2444,
- 2445,
- 2446,
- 2447,
- 2448,
- 2449,
- 2450,
- 2451,
- 2452,
- 2453,
- 2454,
- 2455,
- 2456,
- 2457,
- 2458,
- 2459,
- 2460,
- 2461,
- 2462,
- 2463,
- 2464,
- 2465,
- 2466,
- 2467,
- 2466,
- 2467,
- 2466,
- 2468,
- 2469,
- 2470,
- 2471,
- 2472,
- 2473,
- 2474,
- 2475,
- 2476,
- 2477,
- 2478,
- 2479,
- 2480,
- 2481,
- 2482,
- 2483,
- 2484,
- 2485,
- 2486,
- 2487,
- 2488,
- 2489,
- 2490,
- 2491,
- 2492,
- 2493,
- 2494,
- 2495,
- 2496,
- 2497,
- 2498,
- 2499,
- 2500,
- 2501,
- 2502,
- 2503,
- 2504,
- 2505,
- 2506,
- 2507,
- 2508,
- 2509,
- 2510,
- 2511,
- 2512,
- 2513,
- 2514,
- 2515,
- 2516,
- 2517,
- 2518,
- 2519,
- 2520,
- 2521,
- 2522,
- 2523,
- 2524,
- 2525,
- 2526,
- 2527,
- 2528,
- 2529,
- 2530,
- 2531,
- 2532,
- 2533,
- 2534,
- 2535,
- 2536,
- 2537,
- 2538,
- 2539,
- 2540,
- 2541,
- 2542,
- 2543,
- 2544,
- 2545,
- 2546,
- 2547,
- 2548,
- 2549,
- 2550,
- 2551,
- 2552,
- 2553,
- 2554,
- 2555,
- 2556,
- 2557,
- 2558,
- 2559,
- 2560,
- 2561,
- 2562,
- 2563,
- 2564,
- 2565,
- 2566,
- 2567,
- 2549,
- 2550,
- 2551,
- 2552,
- 2568,
- 2569,
- 2570,
- 2571,
- 2572,
- 2573,
- 2574,
- 2575,
- 2576,
- 2577,
- 2578,
- 2579,
- 2580,
- 2581,
- 2582,
- 2583,
- 2584,
- 2585,
- 2586,
- 2587,
- 2588,
- 2589,
- 2590,
- 2591,
- 2592,
- 2593,
- 2594,
- 2595,
- 2596,
- 2597,
- 2598,
- 2599,
- 2600,
- 2601,
- 2602,
- 2603,
- 2604,
- 2605,
- 2606,
- 2607,
- 2608,
- 2609,
- 2610,
- 2611,
- 2612,
- 2613,
- 2614,
- 2615,
- 2616,
- 2617,
- 2618,
- 2619,
- 2620,
- 2621,
- 2622,
- 2623,
- 2624,
- 2625,
- 2626,
- 2627,
- 2628,
- 2629,
- 2630,
- 2631,
- 2632,
- 2633,
- 2634,
- 2635,
- 2636,
- 2637,
- 2638,
- 2639,
- 2640,
- 2641,
- 2640,
- 2642,
- 2643,
- 2644,
- 2645,
- 2646,
- 2647,
- 2648,
- 2649,
- 2650,
- 2651,
- 2652,
- 2653,
- 2652,
- 2653,
- 2654,
- 2655,
- 2656,
- 2657,
- 2658,
- 2659,
- 2660,
- 2661,
- 2662,
- 2663,
- 2664,
- 2665,
- 2666,
- 2667,
- 2668,
- 2669,
- 2670,
- 2671,
- 2672,
- 2673,
- 2674,
- 2675,
- 2676,
- 2677,
- 2678,
- 2679,
- 2680,
- 2681,
- 2682,
- 2683,
- 2684,
- 2685,
- ],
- "length": 4239,
- "prefixOffset": Int32Array [
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 17,
- 1,
- 1,
- 21,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 30,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 34,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 99,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 9,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 20,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 11,
- 34,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 71,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 79,
- 1,
- 1,
- 1,
- 1,
- 94,
- 1,
- 1,
- 1,
- 1,
- 101,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 113,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 124,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 40,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 74,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 308,
- 1,
- 1,
- 1,
- 1,
- 314,
- 1,
- 1,
- 1,
- 1,
- 1,
- 102,
- 1,
- 1,
- 1,
- 1,
- 1,
- 227,
- 1,
- 324,
- 1,
- 1,
- 1,
- 328,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 337,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 347,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 38,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 22,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 10,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 5,
- 6,
- 7,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 18,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 43,
- 1,
- 1,
- 1,
- 1,
- 1,
- 121,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 134,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 146,
- 1,
- 1,
- 496,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 509,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 42,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 53,
- 1,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 49,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 60,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 97,
- 1,
- 1,
- 1,
- 103,
- 1,
- 77,
- 1,
- 1,
- 1,
- 79,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 19,
- 1,
- 21,
- 146,
- 1,
- 1,
- 1,
- 161,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 168,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 188,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 203,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 251,
- 1,
- 1,
- 2,
- 1,
- 256,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 268,
- 1,
- 329,
- 1,
- 336,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 890,
- 886,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 905,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 863,
- 1,
- 1,
- 1,
- 1,
- 858,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 867,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 879,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 784,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 809,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 31,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 41,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 909,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 968,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1015,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1141,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 936,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 992,
- 1,
- 1215,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 20,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 291,
- 250,
- 1,
- 232,
- 1,
- 1357,
- 1,
- 1357,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 9,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1278,
- 1,
- 1,
- 1,
- 1166,
- 1,
- 1284,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 12,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 30,
- 1,
- 45,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 54,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 78,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 129,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1429,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 9,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 17,
- 1,
- 1,
- 1,
- 1,
- 1,
- 479,
- 453,
- 1,
- 1,
- 1,
- 326,
- 1,
- 1,
- 1,
- 496,
- 1,
- 1,
- 1,
- 444,
- 1,
- 1,
- 348,
- 1472,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 337,
- 197,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 175,
- 1,
- 1,
- 1,
- 1,
- 1603,
- 112,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 65,
- 553,
- 491,
- 1,
- 1397,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 234,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 200,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1444,
- 1,
- 1,
- 1,
- 1,
- 131,
- 1,
- 1,
- 1,
- 596,
- 1567,
- 566,
- 1,
- 449,
- 152,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 170,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 125,
- 1,
- 1,
- 345,
- 302,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 199,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 20,
- 27,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 35,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 55,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 421,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 305,
- 1,
- 1,
- 1,
- 299,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 275,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 761,
- 243,
- 1,
- 1,
- 1,
- 1,
- 489,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 239,
- 1,
- 520,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 393,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 398,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 372,
- 1,
- 721,
- 1,
- 1,
- 1,
- 1,
- 1,
- 567,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 298,
- 1,
- 1862,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 868,
- 1,
- 1,
- 1,
- 1875,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 485,
- 1,
- 1,
- 1,
- 1,
- 930,
- 1,
- 734,
- 67,
- 1,
- 1,
- 1,
- 1,
- 1,
- 615,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 678,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1979,
- 1,
- 1,
- 1,
- 2,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 2,
- 29,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 36,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 10,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 62,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 29,
- 1,
- 1,
- 1,
- 1,
- 32,
- 1,
- 1,
- 1,
- 54,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 105,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 35,
- 1,
- 1,
- 124,
- 73,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 90,
- 1,
- 1,
- 144,
- 1,
- 1,
- 1,
- 51,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 131,
- 1,
- 1,
- 1,
- 1,
- 47,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 196,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 94,
- 166,
- 1,
- 1,
- 1,
- 1,
- 233,
- 1,
- 1,
- 1,
- 104,
- 1,
- 1,
- 1,
- 1,
- 280,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 300,
- 1,
- 1376,
- 1,
- 1,
- 1,
- 1357,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1283,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2335,
- 1,
- 1,
- 2120,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1184,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1215,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2181,
- 1,
- 963,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1321,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 1293,
- 1,
- 2237,
- 1,
- 1,
- 1,
- 502,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 487,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 2508,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 37,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 48,
- 1,
- 1,
- 124,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1115,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 19,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 39,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 47,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 54,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 61,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 70,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 19,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 31,
- 1,
- 1,
- 34,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 57,
- 1,
- 1,
- 1,
- 54,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 10,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 38,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 46,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 31,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 31,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 9,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 16,
- 1,
- 1,
- 19,
- 0,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 9,
- 1,
- 2,
- 3,
- 1,
- 1,
- 5,
- 6,
- 1,
- 18,
- 9,
- 10,
- 1,
- 1,
- 1,
- 1,
- 25,
- 14,
- 35,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 19,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 46,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 104,
- 1,
- 1,
- 1,
- 1,
- 99,
- 1,
- 1,
- 1,
- 106,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 37,
- 1,
- 1,
- 1,
- 38,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 12,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 1,
- 1,
- 19,
- 1,
- 1,
- 1,
- 23,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 15,
- 1,
- 1,
- 97,
- 1,
- 1,
- 1,
- 98,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 111,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 123,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 96,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 59,
- 1,
- 1,
- 42,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 9,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 10,
- 13,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 1,
- 19,
- 1,
- 19,
- 22,
- 23,
- 1,
- 1,
- 24,
- 27,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 33,
- 1,
- 54,
- 1,
- 54,
- 1,
- 35,
- 1,
- 1,
- 11,
- 34,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 52,
- 1,
- 1,
- 1,
- 77,
- 1,
- 1,
- 1,
- 1,
- 1,
- 16,
- 1,
- 12,
- 1,
- 1,
- 1,
- 71,
- 70,
- 1,
- 67,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 98,
- 1,
- 1,
- 1,
- 1,
- 1,
- 41,
- 27,
- 1,
- 1,
- 1,
- 1,
- 1,
- 71,
- 85,
- 1,
- 100,
- 1,
- 119,
- 7,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 0,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 24,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 1,
- 1,
- 20,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 41,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 13,
- 1,
- 1,
- 1,
- 1,
- 1,
- 64,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 3,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 12,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 24,
- 1,
- 1,
- 1,
- 40,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 11,
- 1,
- 1,
- 1,
- 1,
- 18,
- 26,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 40,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 9,
- 1,
- 1,
- 1,
- 1,
- 1,
- 55,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 10,
- 1,
- 1,
- 1,
- 1,
- 1,
- 113,
- 1,
- 1,
- 1,
- 105,
- 1,
- 1,
- 1,
- 1,
- 1,
- 74,
- 1,
- 1,
- 72,
- 76,
- 1,
- 1,
- 1,
- 1,
- 70,
- 1,
- 1,
- 89,
- 1,
- 1,
- 9,
- 86,
- 4,
- 99,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 22,
- 1,
- 1,
- 1,
- 1,
- 71,
- 1,
- 1,
- 1,
- 1,
- 1,
- 133,
- 1,
- 1,
- 1,
- 61,
- 1,
- 1,
- 1,
- 1,
- 134,
- 1,
- 1,
- 1,
- 1,
- 47,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 40,
- 155,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 107,
- 1,
- 1,
- 1,
- 1,
- 180,
- 1,
- 147,
- 159,
- 160,
- 10,
- 230,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 37,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 45,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 6,
- 1,
- 1,
- 20,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 1,
- 1,
- 7,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 1,
- 10,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 12,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 14,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 21,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 49,
- 1,
- 1,
- 1,
- 65,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 12,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 5,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 8,
- 1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 4,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 27,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 39,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- ],
- },
- "stringArray": Array [
- "com.android.internal.os.ZygoteInit.main",
- "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run",
- "java.lang.reflect.Method.invoke",
- "android.app.ActivityThread.main",
- "android.os.Looper.loop",
- "android.os.Handler.dispatchMessage",
- "android.app.ActivityThread$H.handleMessage",
- "android.app.ActivityThread.-wrap11",
- "android.app.ActivityThread.handleLaunchActivity",
- "android.app.ActivityThread.performLaunchActivity",
- "android.app.Instrumentation.callActivityOnCreate",
- "android.app.Activity.performCreate",
- "android.app.ActivityTransitionState.setEnterActivityOptions",
- "com.android.internal.policy.PhoneWindow.getDecorView",
- "com.android.internal.policy.PhoneWindow.installDecor",
- "com.android.internal.policy.PhoneWindow.generateDecor",
- "com.android.internal.policy.DecorView.",
- "android.view.animation.AnimationUtils.loadInterpolator",
- "android.view.animation.AnimationUtils.createInterpolatorFromXml",
- "android.view.animation.PathInterpolator.",
- "android.view.animation.PathInterpolator.parseInterpolatorFromTypeArray",
- "android.view.animation.PathInterpolator.initCubic",
- "android.view.animation.PathInterpolator.initPath",
- "android.graphics.Path.approximate",
- "android.graphics.Path.nApproximate",
- "android.app.Activity.performStart",
- "android.os.SystemProperties.getInt",
- "android.os.SystemProperties.native_get_int",
- "android.app.ActivityThread.handleResumeActivity",
- "android.app.ActivityThread.performResumeActivity",
- "android.app.Activity.performResume",
- "android.app.FragmentController.dispatchResume",
- "android.app.FragmentManagerImpl.dispatchResume",
- "android.app.FragmentManagerImpl.dispatchMoveToState",
- "android.app.FragmentManagerImpl.moveToState",
- "android.app.FragmentManagerImpl.moveFragmentToExpectedState",
- "android.app.Fragment.performResume",
- "androidx.lifecycle.ReportFragment.onResume",
- "androidx.lifecycle.ReportFragment.dispatchResume",
- "androidx.lifecycle.ProcessLifecycleOwner$2.onResume",
- "androidx.lifecycle.ProcessLifecycleOwner.activityResumed",
- "androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent",
- "androidx.lifecycle.LifecycleRegistry.moveToState",
- "androidx.lifecycle.LifecycleRegistry.sync",
- "androidx.lifecycle.LifecycleRegistry.forwardPass",
- "androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent",
- "androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged",
- "androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks",
- "androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent",
- "androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback",
- "org.mozilla.geckoview.GeckoRuntime$LifecycleListener.onResume",
- "org.mozilla.gecko.GeckoNetworkManager.start",
- "org.mozilla.gecko.GeckoNetworkManager.handleManagerEvent",
- "org.mozilla.gecko.GeckoNetworkManager.performActionsForStateEvent",
- "org.mozilla.gecko.GeckoNetworkManager.updateNetworkStateAndConnectionType",
- "android.net.NetworkInfo.getType",
- "android.view.WindowManagerImpl.addView",
- "android.view.WindowManagerGlobal.addView",
- "android.view.Window.adjustLayoutParamsForSubWindow",
- "android.app.Activity.getSystemService",
- "android.view.ContextThemeWrapper.getSystemService",
- "android.app.ContextImpl.getSystemService",
- "android.app.SystemServiceRegistry.getSystemService",
- "android.app.SystemServiceRegistry$CachedServiceFetcher.getService",
- "android.app.SystemServiceRegistry$15.createService",
- "android.os.ServiceManager.getServiceOrThrow",
- "android.os.ServiceManager.getService",
- "android.os.ServiceManagerProxy.getService",
- "android.os.Parcel.writeInterfaceToken",
- "android.os.Parcel.nativeWriteInterfaceToken",
- "android.app.admin.DevicePolicyManager.isAovBypassKeyguardGoogleNowEnabled",
- "android.app.admin.DevicePolicyManager.isAovBypassKeyguardGoogleNowSupported",
- "com.motorola.android.provider.MotorolaSettings$Secure.getInt",
- "com.motorola.android.provider.MotorolaSettings$Secure.getIntForUser",
- "com.motorola.android.provider.MotorolaSettings$Secure.getStringForUser",
- "com.motorola.android.provider.MotorolaSettings$NameValueCache.getStringForUser",
- "android.content.ContentProviderProxy.call",
- "android.os.BinderProxy.transact",
- "android.os.BinderProxy.transactNative",
- "android.view.ViewRootImpl.",
- "android.view.Choreographer.getInstance",
- "java.lang.ThreadLocal.get",
- "java.lang.ThreadLocal.setInitialValue",
- "android.view.Choreographer$1.initialValue",
- "android.view.Choreographer.",
- "android.view.Choreographer$FrameDisplayEventReceiver.",
- "android.view.DisplayEventReceiver.",
- "android.view.DisplayEventReceiver.nativeInit",
- "android.view.ViewRootImpl.setView",
- "android.view.ViewRootImpl.enableHardwareAcceleration",
- "android.view.ThreadedRenderer.create",
- "android.view.ThreadedRenderer.",
- "android.view.ThreadedRenderer$ProcessInitializer.init",
- "android.view.ThreadedRenderer$ProcessInitializer.initGraphicsStats",
- "android.view.ThreadedRenderer$ProcessInitializer.requestBuffer",
- "android.view.IGraphicsStats$Stub$Proxy.requestBufferForProcess",
- "android.os.Handler.handleCallback",
- "kotlinx.coroutines.DispatchedTask.run",
- "kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith",
- "mozilla.components.lib.state.ext.StoreExtensionsKt$flowScoped$$inlined$apply$lambda$1.invokeSuspend",
- "mozilla.components.support.webextensions.WebExtensionSupport$registerHandlersForNewSessions$1.invoke",
- "mozilla.components.support.webextensions.WebExtensionSupport$registerHandlersForNewSessions$1.invokeSuspend",
- "kotlinx.coroutines.flow.FlowKt__MergeKt$flattenConcat$$inlined$unsafeFlow$1.collect",
- "kotlinx.coroutines.flow.FlowKt__MergeKt$flatMapConcat$$inlined$map$1.collect",
- "mozilla.components.support.webextensions.WebExtensionSupport$registerHandlersForNewSessions$1$invokeSuspend$$inlined$mapNotNull$1.collect",
- "kotlinx.coroutines.flow.internal.ChannelFlow.collect",
- "kotlin.jvm.internal.Intrinsics.coroutineScope",
- "org.mozilla.fenix.IntentReceiverActivity$onCreate$1.invokeSuspend",
- "org.mozilla.fenix.IntentReceiverActivity.processIntent",
- "org.mozilla.fenix.components.metrics.ReleaseMetricController.track",
- "org.mozilla.fenix.components.metrics.GleanMetricsService.shouldTrack",
- "kotlin.jvm.internal.Intrinsics.access$getWrapper$p",
- "org.mozilla.fenix.components.metrics.GleanMetricsService.track",
- "org.mozilla.fenix.components.metrics.GleanMetricsServiceKt$wrapper$123.invoke",
- "org.mozilla.fenix.GleanMetrics.Events.openedLink",
- "kotlin.SynchronizedLazyImpl.getValue",
- "org.mozilla.fenix.GleanMetrics.Events$openedLink$2.invoke",
- "mozilla.telemetry.glean.private.EventMetricType.",
- "",
- "java.lang.reflect.Proxy.invoke",
- "com.sun.jna.Library$Handler.invoke",
- "com.sun.jna.NativeLibrary.getFunction",
- "com.sun.jna.Function.",
- "com.sun.jna.NativeLibrary.getSymbolAddress",
- "com.sun.jna.Native.findSymbol",
- "org.mozilla.fenix.components.Components.getIntentProcessors",
- "org.mozilla.fenix.components.Components$intentProcessors$2.invoke",
- "org.mozilla.fenix.components.Components.getUseCases",
- "org.mozilla.fenix.components.Components$useCases$2.invoke",
- "org.mozilla.fenix.components.Components.getSearch",
- "org.mozilla.fenix.components.Components$search$2.invoke",
- "org.mozilla.fenix.components.Search.",
- "org.mozilla.fenix.components.searchengine.FenixSearchEngineProvider.",
- "org.mozilla.fenix.components.searchengine.FenixSearchEngineProvider.refreshAsync",
- "org.mozilla.fenix.components.UseCases.",
- "org.mozilla.fenix.components.IntentProcessors.",
- "mozilla.components.feature.intent.processing.TabIntentProcessor.process",
- "mozilla.components.feature.intent.processing.TabIntentProcessor.createSession",
- "mozilla.components.browser.session.SessionManager.add$default",
- "mozilla.components.browser.session.SessionManager.add",
- "kotlin.jvm.internal.Intrinsics.syncDispatch",
- "kotlin.jvm.internal.Intrinsics.runBlocking$default",
- "kotlin.jvm.internal.Intrinsics.runBlocking",
- "java.util.concurrent.locks.LockSupport.parkNanos",
- "sun.misc.Unsafe.park",
- "java.lang.Thread.parkFor$",
- "java.lang.Object.wait",
- "mozilla.components.feature.session.SessionUseCases$DefaultLoadUrlUseCase.invoke",
- "mozilla.components.browser.session.SessionManager.getOrCreateEngineSession",
- "mozilla.components.browser.engine.gecko.GeckoEngine.createSession",
- "mozilla.components.browser.engine.gecko.GeckoEngineSession.",
- "mozilla.components.browser.engine.gecko.GeckoEngineSession.createGeckoSession",
- "mozilla.components.browser.engine.gecko.GeckoEngineSession$1.invoke",
- "org.mozilla.geckoview.GeckoSession.",
- "org.mozilla.geckoview.SessionTextInput.",
- "org.mozilla.geckoview.GeckoSession$10.",
- "org.mozilla.geckoview.GeckoSessionHandler.",
- "org.mozilla.geckoview.GeckoSession.getEventDispatcher",
- "org.mozilla.geckoview.GeckoSession.setMediaDelegate",
- "org.mozilla.geckoview.GeckoSessionHandler.setDelegate",
- "org.mozilla.gecko.EventDispatcher.registerUiThreadListener",
- "org.mozilla.gecko.EventDispatcher.checkNotRegisteredElsewhere",
- "org.mozilla.gecko.MultiMap.containsKey",
- "mozilla.components.browser.session.LegacySessionManager.link",
- "kotlinx.coroutines.EventLoopImplBase.processNextEvent",
- "mozilla.components.browser.session.ext.BrowserStoreExtensionsKt$syncDispatch$1.invokeSuspend",
- "androidx.transition.CanvasUtils.throwOnFailure",
- "android.app.Activity.startActivity",
- "android.app.Activity.startActivityForResult",
- "android.app.Instrumentation.execStartActivity",
- "android.app.IActivityManager$Stub$Proxy.startActivity",
- "android.app.Activity.finish",
- "android.app.IActivityManager$Stub$Proxy.finishActivity",
- "mozilla.telemetry.glean.GleanInternalAPI$initialize$1$2.invokeSuspend",
- "androidx.lifecycle.LifecycleRegistry.addObserver",
- "mozilla.telemetry.glean.scheduler.GleanLifecycleObserver.onStateChanged",
- "mozilla.telemetry.glean.private.TimespanMetricType.start",
- "android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run",
- "android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7",
- "android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52851",
- "org.mozilla.gecko.GeckoNetworkManager.onReceive",
- "org.mozilla.gecko.GeckoNetworkManager.sendNetworkStateToListeners",
- "org.mozilla.gecko.GeckoNetworkManager.wifiDhcpGatewayAddress",
- "android.net.wifi.WifiManager.getDhcpInfo",
- "android.net.wifi.IWifiManager$Stub$Proxy.getDhcpInfo",
- "android.view.Choreographer$FrameDisplayEventReceiver.run",
- "android.view.Choreographer.doFrame",
- "android.view.Choreographer.doCallbacks",
- "android.view.Choreographer$CallbackRecord.run",
- "android.view.ViewRootImpl$TraversalRunnable.run",
- "android.view.ViewRootImpl.doTraversal",
- "android.view.ViewRootImpl.performTraversals",
- "android.view.ViewRootImpl.relayoutWindow",
- "android.view.IWindowSession$Stub$Proxy.relayout",
- "android.view.Surface.allocateBuffers",
- "android.view.Surface.nativeAllocateBuffers",
- "org.mozilla.fenix.components.Core$sessionManager$2$$special$$inlined$also$lambda$1.invokeSuspend",
- "mozilla.components.browser.session.SessionManager.restore",
- "mozilla.components.browser.session.LegacySessionManager.restore",
- "kotlin.collections.AbstractList$IteratorImpl.next",
- "kotlin.collections.ReversedListReadOnly.get",
- "androidx.transition.CanvasUtils.getLastIndex",
- "kotlin.collections.AbstractCollection.size",
- "kotlin.collections.ReversedListReadOnly.getSize",
- "mozilla.components.browser.session.LegacySessionManager.notifyObservers",
- "mozilla.components.support.base.observer.ObserverRegistry.notifyObservers",
- "-$$LambdaGroup$ks$MukCr_go4WuklArSqsIRLln6IRE.invoke",
- "mozilla.components.browser.session.utils.Observer.onSessionsRestored",
- "mozilla.components.browser.session.utils.AllSessionsObserver.registerToAllSessions$browser_session_release",
- "mozilla.components.browser.session.utils.AllSessionsObserver.registerSession$browser_session_release",
- "mozilla.components.feature.media.state.MediaSessionObserver.onRegisteredToSession",
- "mozilla.components.feature.media.state.MediaSessionObserver.updateState",
- "kotlin.jvm.internal.Intrinsics.launch$default",
- "kotlin.jvm.internal.Intrinsics.launch",
- "kotlinx.coroutines.AbstractCoroutine.start",
- "kotlin.jvm.internal.Intrinsics.startCoroutineCancellable",
- "kotlinx.coroutines.DispatchedContinuationKt.resumeCancellableWith",
- "kotlinx.coroutines.scheduling.ExperimentalCoroutineDispatcher.dispatch",
- "kotlinx.coroutines.scheduling.CoroutineScheduler.dispatch$default",
- "kotlinx.coroutines.scheduling.CoroutineScheduler.dispatch",
- "kotlinx.coroutines.scheduling.CoroutineScheduler.signalCpuWork$kotlinx_coroutines_core",
- "kotlinx.coroutines.scheduling.CoroutineScheduler.tryUnpark",
- "java.util.concurrent.locks.LockSupport.unpark",
- "sun.misc.Unsafe.unpark",
- "java.lang.Thread.unpark$",
- "java.lang.Object.notifyAll",
- "kotlin.jvm.internal.Intrinsics.cancel$default",
- "kotlinx.coroutines.JobSupport.cancel",
- "kotlinx.coroutines.JobCancellationException.",
- "java.util.concurrent.CancellationException.",
- "kotlinx.coroutines.AbstractCoroutine.initParentJob$kotlinx_coroutines_core",
- "kotlinx.coroutines.JobSupport.initParentJobInternal$kotlinx_coroutines_core",
- "kotlinx.coroutines.JobSupport.isCompleted",
- "kotlinx.coroutines.JobSupport.getState$kotlinx_coroutines_core",
- "kotlinx.coroutines.scheduling.CoroutineScheduler.createTask$kotlinx_coroutines_core",
- "kotlinx.coroutines.scheduling.NanoTimeSource.nanoTime",
- "java.lang.System.nanoTime",
- "kotlinx.coroutines.BlockingCoroutine.",
- "kotlinx.coroutines.AbstractCoroutine.",
- "kotlin.coroutines.AbstractCoroutineContextElement.plus",
- "kotlin.coroutines.CoroutineContext$Element$DefaultImpls.plus",
- "androidx.transition.CanvasUtils.plus",
- "kotlinx.coroutines.JobSupport.fold",
- "kotlin.coroutines.CoroutineContext$Element$DefaultImpls.fold",
- "kotlin.coroutines.CoroutineContext$plus$1.invoke",
- "kotlin.coroutines.CombinedContext.",
- "kotlinx.coroutines.AbstractCoroutine.resumeWith",
- "kotlinx.coroutines.AbstractCoroutine.afterResume",
- "mozilla.components.lib.state.Store.dispatch",
- "androidx.transition.CanvasUtils.createCoroutineUnintercepted",
- "mozilla.components.lib.state.Store$dispatch$1.create",
- "mozilla.components.lib.state.Store$dispatch$1.",
- "kotlin.coroutines.jvm.internal.SuspendLambda.",
- "kotlin.coroutines.jvm.internal.ContinuationImpl.",
- "kotlinx.coroutines.AbstractCoroutine.getContext",
- "mozilla.components.browser.session.storage.AutoSave.periodicallyInForeground",
- "androidx.lifecycle.LifecycleRegistry$ObserverWithState.",
- "androidx.lifecycle.Lifecycling.lifecycleEventObserver",
- "androidx.lifecycle.Lifecycling.getObserverConstructorType",
- "androidx.lifecycle.Lifecycling.resolveObserverCallbackType",
- "androidx.lifecycle.ClassesInfoCache.hasLifecycleMethods",
- "androidx.lifecycle.ClassesInfoCache.createInfo",
- "androidx.lifecycle.ClassesInfoCache$CallbackInfo.",
- "java.util.HashMap$Node.getValue",
- "android.app.ActivityThread.-wrap15",
- "android.app.ActivityThread.handlePauseActivity",
- "android.app.IActivityManager$Stub$Proxy.activityPaused",
- "android.view.ViewRootImpl$ViewRootHandler.handleMessage",
- "android.view.inputmethod.InputMethodManager.onPostWindowFocus",
- "android.view.inputmethod.InputMethodManager.startInputInner",
- "com.android.internal.view.IInputMethodManager$Stub$Proxy.startInputOrWindowGainedFocus",
- "android.view.ViewRootImpl.performDraw",
- "android.view.ViewRootImpl.pendingDrawFinished",
- "android.view.ViewRootImpl.reportDrawFinished",
- "android.view.IWindowSession$Stub$Proxy.finishDrawing",
- "org.mozilla.gecko.GeckoThread$1.run",
- "org.mozilla.gecko.GeckoThread.runUiThreadCallback",
- "android.app.ActivityThread.createBaseContextForActivity",
- "android.app.IActivityManager$Stub$Proxy.getActivityDisplayId",
- "android.app.Instrumentation.newActivity",
- "java.lang.Class.newInstance",
- "org.mozilla.fenix.HomeActivity.",
- "mozilla.components.support.locale.LocaleAwareAppCompatActivity.",
- "androidx.appcompat.app.AppCompatActivity.",
- "androidx.fragment.app.FragmentActivity.",
- "androidx.fragment.app.FragmentActivity$HostCallbacks.",
- "androidx.fragment.app.FragmentManagerImpl.",
- "androidx.fragment.app.FragmentManager.",
- "androidx.appcompat.app.AppCompatActivity.setTheme",
- "android.app.Activity.setTheme",
- "android.view.ContextThemeWrapper.setTheme",
- "android.view.ContextThemeWrapper.initializeTheme",
- "android.app.Activity.onApplyThemeResource",
- "android.view.ContextThemeWrapper.onApplyThemeResource",
- "android.content.res.Resources$Theme.applyStyle",
- "android.content.res.ResourcesImpl$ThemeImpl.applyStyle",
- "android.content.res.AssetManager.applyThemeStyle",
- "android.app.Activity.setTaskDescription",
- "android.app.IActivityManager$Stub$Proxy.setTaskDescription",
- "org.mozilla.fenix.HomeActivity.onCreate",
- "androidx.appcompat.app.AppCompatActivity.onCreate",
- "androidx.appcompat.app.AppCompatDelegateImpl.onCreate",
- "androidx.appcompat.app.ResourcesFlusher.getParentActivityName",
- "android.app.ApplicationPackageManager.getActivityInfo",
- "android.content.pm.IPackageManager$Stub$Proxy.getActivityInfo",
- "org.mozilla.fenix.theme.DefaultThemeManager.applyStatusBarTheme",
- "org.mozilla.fenix.theme.ThemeManager$Companion.updateLightSystemBars",
- "com.android.internal.policy.PhoneWindow.generateLayout",
- "com.android.internal.policy.DecorView.onResourcesLoaded",
- "com.android.internal.policy.DecorView.getStackId",
- "android.app.Activity.getWindowStackId",
- "android.app.IActivityManager$Stub$Proxy.getActivityStackId",
- "android.view.LayoutInflater.inflate",
- "android.view.LayoutInflater.createViewFromTag",
- "org.mozilla.fenix.HomeActivity.onCreateView",
- "androidx.fragment.app.FragmentActivity.onCreateView",
- "androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView",
- "androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView",
- "androidx.appcompat.app.AppCompatActivity.setContentView",
- "androidx.appcompat.app.AppCompatDelegateImpl.setContentView",
- "androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor",
- "android.view.LayoutInflater.createView",
- "java.lang.ClassLoader.loadClass",
- "java.lang.ClassLoader.findLoadedClass",
- "java.lang.VMClassLoader.findLoadedClass",
- "android.view.LayoutInflater.rInflateChildren",
- "android.view.LayoutInflater.rInflate",
- "android.view.LayoutInflater.parseInclude",
- "android.content.res.XmlBlock$Parser.next",
- "androidx.appcompat.widget.ViewUtils.makeOptionalFitsSystemWindows",
- "java.lang.Class.getMethod",
- "java.lang.Class.getPublicMethodRecursive",
- "java.lang.Class.getDeclaredMethodInternal",
- "androidx.fragment.app.FragmentManager.moveToState",
- "androidx.fragment.app.Fragment.performCreate",
- "androidx.navigation.fragment.NavHostFragment.onCreate",
- "androidx.navigation.NavHostController.",
- "androidx.navigation.NavController.",
- "androidx.navigation.NavigatorProvider.addNavigator",
- "androidx.navigation.NavigatorProvider.getNameForNavigator",
- "",
- "libcore.reflect.AnnotationFactory.invoke",
- "java.lang.reflect.Method.getName",
- "java.lang.reflect.Executable.getMethodNameInternal",
- "androidx.navigation.NavController.setGraph",
- "androidx.navigation.NavInflater.inflate",
- "androidx.navigation.fragment.FragmentNavigator$Destination.onInflate",
- "androidx.navigation.NavDestination.onInflate",
- "android.content.res.TypedArray.getResourceId",
- "androidx.collection.SparseArrayCompat.put",
- "android.content.res.XmlBlock$Parser.getName",
- "androidx.navigation.NavInflater.inflateArgument",
- "java.lang.Class.forName",
- "java.lang.Class.classForName",
- "mozilla.components.concept.engine.prompt.ShareData.",
- "androidx.navigation.NavGraph.addDestination",
- "java.lang.System.arraycopy",
- "androidx.navigation.NavController.navigate",
- "androidx.navigation.NavGraphNavigator.navigate",
- "androidx.navigation.fragment.FragmentNavigator.navigate",
- "androidx.fragment.app.FragmentContainer.instantiate",
- "androidx.fragment.app.Fragment.instantiate",
- "java.lang.reflect.Constructor.newInstance",
- "java.lang.reflect.Constructor.newInstance0",
- "org.mozilla.fenix.home.HomeFragment.",
- "androidx.fragment.app.Fragment.",
- "java.util.UUID.randomUUID",
- "java.security.SecureRandom.nextBytes",
- "com.android.org.conscrypt.OpenSSLRandom.engineNextBytes",
- "com.android.org.conscrypt.NativeCrypto.RAND_bytes",
- "androidx.fragment.app.Fragment.performCreateView",
- "androidx.lifecycle.MutableLiveData.setValue",
- "androidx.lifecycle.LiveData.setValue",
- "androidx.lifecycle.LiveData.assertMainThread",
- "androidx.arch.core.executor.ArchTaskExecutor.getInstance",
- "androidx.arch.core.executor.ArchTaskExecutor.",
- "org.mozilla.fenix.home.intent.OpenBrowserIntentProcessor.process",
- "org.mozilla.fenix.HomeActivity.openToBrowser",
- "org.mozilla.fenix.HomeActivity.getNavDirections",
- "org.mozilla.fenix.NavGraphDirections.",
- "kotlin.jvm.internal.Intrinsics.nav$default",
- "kotlin.jvm.internal.Intrinsics.nav",
- "androidx.navigation.NavBackStackEntry.",
- "org.mozilla.fenix.components.metrics.GleanMetricsServiceKt$wrapper$1.invoke",
- "org.mozilla.fenix.GleanMetrics.Events.appOpened",
- "org.mozilla.fenix.GleanMetrics.Events$appOpened$2.invoke",
- "com.sun.jna.Function.invoke",
- "org.mozilla.fenix.perf.StartupTimeline.onActivityCreateEndHome",
- "org.mozilla.fenix.perf.StartupReportFullyDrawn.attachReportFullyDrawn",
- "-$$LambdaGroup$js$NdjJqjBzW1-E8F7rlKKzSlHUE0E.",
- "android.app.FragmentController.dispatchActivityCreated",
- "android.app.FragmentManagerImpl.dispatchActivityCreated",
- "android.app.Fragment.performActivityCreated",
- "androidx.lifecycle.ReportFragment.onActivityCreated",
- "androidx.lifecycle.ReportFragment.dispatch",
- "org.mozilla.fenix.components.metrics.BreadcrumbsRecorder.onCreate",
- "androidx.navigation.NavController.addOnDestinationChangedListener",
- "org.mozilla.fenix.components.metrics.BreadcrumbsRecorder.onDestinationChanged",
- "org.mozilla.fenix.HomeActivity$onCreate$3.invoke",
- "org.mozilla.fenix.HomeActivity.getBreadcrumbMessage",
- "com.android.tools.r8.GeneratedOutlineSupport.outline11",
- "java.lang.StringBuilder.",
- "android.app.Instrumentation.callActivityOnStart",
- "androidx.appcompat.app.AppCompatActivity.onStart",
- "androidx.fragment.app.FragmentActivity.onStart",
- "androidx.fragment.app.FragmentManager.dispatchStateChange",
- "androidx.fragment.app.FragmentManager.moveFragmentToExpectedState",
- "androidx.fragment.app.Fragment.performActivityCreated",
- "androidx.fragment.app.FragmentManager.execPendingActions",
- "androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute",
- "androidx.fragment.app.FragmentManager.executeOpsTogether",
- "java.util.ArrayList.remove",
- "androidx.fragment.app.Fragment.equals",
- "androidx.fragment.app.FragmentManager.addAddedFragments",
- "org.mozilla.fenix.browser.BrowserFragment.onCreateView",
- "org.mozilla.fenix.browser.BaseBrowserFragment.onCreateView",
- "androidx.coordinatorlayout.widget.CoordinatorLayout.generateLayoutParams",
- "androidx.coordinatorlayout.widget.CoordinatorLayout$LayoutParams.",
- "androidx.coordinatorlayout.widget.CoordinatorLayout.parseBehavior",
- "com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.",
- "mozilla.components.browser.engine.gecko.GeckoEngine.createView",
- "mozilla.components.browser.engine.gecko.GeckoEngineView.",
- "mozilla.components.browser.engine.gecko.GeckoEngineView$currentGeckoView$1.",
- "mozilla.components.browser.engine.gecko.NestedGeckoView.",
- "org.mozilla.geckoview.GeckoView.",
- "mozilla.components.feature.readerview.view.ReaderViewControlsBar.",
- "androidx.constraintlayout.widget.ConstraintLayout.",
- "androidx.constraintlayout.widget.ConstraintLayout.init",
- "org.mozilla.fenix.components.StoreProvider$Companion.get",
- "androidx.lifecycle.ViewModelProvider.get",
- "org.mozilla.fenix.components.StoreProviderFactory.create",
- "org.mozilla.fenix.browser.BaseBrowserFragment$onCreateView$1.invoke",
- "org.mozilla.fenix.components.toolbar.BrowserFragmentStore.",
- "mozilla.components.lib.state.Store.",
- "java.util.Collections.newSetFromMap",
- "org.mozilla.fenix.browser.BaseBrowserFragment.onViewCreated",
- "org.mozilla.fenix.browser.BrowserFragment.initializeUI",
- "org.mozilla.fenix.browser.BaseBrowserFragment.initializeUI",
- "org.mozilla.fenix.components.toolbar.BrowserToolbarView.",
- "android.view.LayoutInflater.from",
- "mozilla.components.browser.toolbar.BrowserToolbar.",
- "android.view.ViewGroup.generateLayoutParams",
- "android.view.ViewGroup$LayoutParams.",
- "android.content.Context.obtainStyledAttributes",
- "android.content.res.Resources$Theme.obtainStyledAttributes",
- "android.content.res.ResourcesImpl$ThemeImpl.obtainStyledAttributes",
- "android.content.res.AssetManager.applyStyle",
- "androidx.constraintlayout.widget.ConstraintLayout.generateLayoutParams",
- "androidx.appcompat.app.AppCompatDelegateImpl.onCreateView",
- "androidx.appcompat.app.AppCompatViewInflater.createView",
- "androidx.appcompat.app.AppCompatViewInflater.createImageView",
- "androidx.appcompat.widget.AppCompatImageView.",
- "androidx.appcompat.widget.AppCompatImageHelper.loadFromAttributes",
- "androidx.appcompat.content.res.AppCompatResources.getDrawable",
- "androidx.appcompat.widget.ResourceManagerInternal.getDrawable",
- "androidx.core.app.ActivityCompat.getDrawable",
- "android.content.Context.getDrawable",
- "android.content.res.Resources.getDrawable",
- "android.content.res.Resources.getDrawableForDensity",
- "android.content.res.ResourcesImpl.loadDrawable",
- "android.content.res.ResourcesImpl.loadDrawableForCookie",
- "android.graphics.drawable.Drawable.createFromXmlForDensity",
- "android.graphics.drawable.Drawable.createFromXmlInnerForDensity",
- "android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity",
- "android.graphics.drawable.VectorDrawable.inflate",
- "android.graphics.drawable.VectorDrawable.inflateChildElements",
- "android.graphics.drawable.VectorDrawable$VFullPath.inflate",
- "android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray",
- "android.util.PathParser$PathData.",
- "android.util.PathParser.-wrap1",
- "android.util.PathParser.nCreatePathDataFromString",
- "mozilla.components.browser.toolbar.display.TrackingProtectionIconView.",
- "android.content.res.ResourcesImpl.loadXmlResourceParser",
- "android.content.res.AssetManager.openXmlBlockAsset",
- "android.content.res.AssetManager.openXmlAssetNative",
- "mozilla.components.browser.toolbar.display.SiteSecurityIconView.",
- "android.graphics.drawable.StateListDrawable.inflate",
- "android.graphics.drawable.StateListDrawable.inflateChildElements",
- "android.content.res.TypedArray.getDrawable",
- "android.content.res.TypedArray.getDrawableForDensity",
- "android.content.res.Resources.loadDrawable",
- "android.graphics.drawable.VectorDrawable.-wrap32",
- "android.graphics.drawable.VectorDrawable.nSetPathString",
- "mozilla.components.browser.toolbar.display.OriginView.",
- "android.animation.LayoutTransition.",
- "android.animation.ObjectAnimator.clone",
- "android.animation.ValueAnimator.clone",
- "android.animation.PropertyValuesHolder$IntPropertyValuesHolder.clone",
- "android.animation.PropertyValuesHolder.clone",
- "android.animation.IntKeyframeSet.clone",
- "mozilla.components.browser.menu.view.MenuButton.",
- "android.widget.FrameLayout.",
- "android.view.ViewGroup.",
- "android.view.ViewGroup.initViewGroup",
- "android.view.View.setFlags",
- "android.view.View.requestLayout",
- "androidx.fragment.app.FragmentManager.getLayoutInflaterFactory",
- "androidx.constraintlayout.widget.ConstraintLayout$LayoutParams.",
- "mozilla.components.ui.autocomplete.InlineAutocompleteEditText.",
- "androidx.appcompat.widget.AppCompatEditText.",
- "android.widget.EditText.",
- "android.widget.TextView.",
- "android.widget.TextView.applySingleLine",
- "android.widget.TextView.setTransformationMethod",
- "android.widget.TextView.setText",
- "mozilla.components.ui.autocomplete.InlineAutocompleteEditText.setText",
- "android.widget.EditText.setText",
- "android.widget.TextView.sendOnTextChanged",
- "android.widget.Editor.sendOnTextChanged",
- "android.widget.Editor.getSelectionActionModeHelper",
- "android.widget.SelectionActionModeHelper.",
- "androidx.appcompat.widget.AppCompatEditText.getTextClassifier",
- "android.widget.TextView.getTextClassifier",
- "android.view.textclassifier.TextClassificationManager.getTextClassifier",
- "android.view.textclassifier.TextClassifierImpl.",
- "androidx.appcompat.widget.AppCompatBackgroundHelper.loadFromAttributes",
- "androidx.appcompat.widget.AppCompatDrawableManager.getTintList",
- "androidx.appcompat.widget.AppCompatTextHelper.",
- "mozilla.components.browser.toolbar.edit.EditToolbar.",
- "mozilla.components.browser.toolbar.edit.EditToolbar.setUrlGoneMargin",
- "androidx.constraintlayout.widget.ConstraintSet.clone",
- "androidx.constraintlayout.widget.ConstraintSet$Constraint.",
- "android.content.res.ResourcesImpl$LookupStack.push",
- "com.android.internal.util.GrowingArrayUtils.append",
- "org.mozilla.fenix.components.Components.getBackgroundServices",
- "org.mozilla.fenix.components.Components$backgroundServices$2.invoke",
- "org.mozilla.fenix.components.BackgroundServices.",
- "mozilla.components.concept.sync.DeviceType.