diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index f5e5ae8e..884a320a 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -17,4 +17,6 @@ jobs: with: channel: 'stable' - run: flutter analyze --fatal-infos --fatal-warnings - - run: dart format --set-exit-if-changed . + - run: | + dart format lib/src/timeline/html/sources/script.js.g.dart + dart format --set-exit-if-changed . diff --git a/analysis_options.yaml b/analysis_options.yaml index c74beea8..5a091341 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -6,6 +6,7 @@ analyzer: exclude: - 'lib/src/checks/**.dart' - 'test/checks/**.dart' + - '**/*.g.dart' # You can customize the lint rules set to your own liking. A list of all rules # can be found at https://dart-lang.github.io/linter/lints/options/options.html diff --git a/lib/src/timeline/html/components/events.dart b/lib/src/timeline/html/components/events.dart new file mode 100644 index 00000000..550353ed --- /dev/null +++ b/lib/src/timeline/html/components/events.dart @@ -0,0 +1,143 @@ +// ignore_for_file: public_member_api_docs + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/components/expandable_box.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; +import 'package:spot/src/timeline/html/web/timeline_event.dart'; + +class Events extends StatelessComponent { + const Events({ + required this.timeLineEvents, + required this.onClick, + super.key, + }); + + final List timeLineEvents; + final void Function(TimelineEvent) onClick; + + @override + Iterable build(BuildContext context) sync* { + for (final event in timeLineEvents) { + yield div( + classes: "event", + styles: Styles.box( + border: Border.all( + event.color != null + ? BorderSide( + color: Color.value(event.color!), + width: 2.px, + ) + : BorderSide(color: Colors.gray, width: 1.px), + ), + ), + [ + if (event.screenshotUrl case final screenshotUrl?) + img( + src: screenshotUrl, + classes: "thumbnail", + alt: "Screenshot", + events: events(onClick: () => onClick(event)), + ), + div(classes: "event-details", [ + ExpandableBox(title: "Event Type", content: event.eventType), + ExpandableBox(title: "Details", content: event.details), + ExpandableBox(title: "Timestamp", content: event.timestamp), + div(classes: "code-location", [ + ExpandableBox(title: "Caller", content: event.caller), + if (event.jetBrainsLink case final jetBrainsLink?) + a(href: jetBrainsLink, [ + button( + classes: "secondary-button secondary-button--animated", + [ + span(classes: "secondary-button__text", [text("IDEA")]), + span(classes: "secondary-button__icon", [text("→")]), + ], + ), + ]), + ]), + ]), + ], + ); + } + } + + static List get styles => [ + css('.event', [ + css('&') + .box(margin: eventMargin, padding: eventPadding) + .flexbox(alignItems: AlignItems.start), + css('& .event-details', [ + css('&') // + .box(margin: eventDetailsMargin, minWidth: Unit.zero) + .flexbox( + direction: FlexDirection.column, + justifyContent: JustifyContent.spaceBetween, + ), + css('& p') // + .box(margin: EdgeInsets.zero, padding: eventDetailsPadding) + .flexItem(flex: const Flex(grow: 1)), + ]), + css('& .code-location') + .box(minWidth: Unit.zero) + .flexbox( + alignItems: AlignItems.center, + direction: FlexDirection.row, + wrap: FlexWrap.wrap, + ) + .raw({'gap': '20px'}), + css('& .thumbnail') + .box( + height: thumbnailHeight, + border: thumbnailBorder, + cursor: Cursor.pointer, + ) + .raw({'object-fit': 'contain'}), + ]), + css('.secondary-button', [ + css('&') + .box( + padding: + EdgeInsets.symmetric(vertical: 6.px, horizontal: 24.px), + border: const Border.all(BorderSide.none()), + radius: BorderRadius.circular(8.px), + cursor: Cursor.pointer, + transition: + const Transition('all', duration: 300, curve: Curve.ease), + width: 100.px, + ) + .text( + fontSize: 12.px, + fontWeight: FontWeight.w600, + ), + css('&.secondary-button--animated', [ + css('&') + .box( + overflow: Overflow.hidden, + position: const Position.relative(), + ) + .background(color: spotOrange), + css('& span').text(color: Colors.white).background( + color: Colors.transparent, + ), + css('& .secondary-button__text').box( + display: Display.inlineBlock, + transition: const Transition( + 'transform', + duration: 300, + curve: Curve.ease, + ), + ), + css('& .secondary-button__icon').box( + position: Position.absolute(right: (-20).px), + transition: + const Transition('right', duration: 300, curve: Curve.ease), + ), + css('&:hover .secondary-button__text') + .box(transform: Transform.translate(x: (-10).px)), + css('&:hover .secondary-button__icon') + .box(position: Position.absolute(right: 20.px)), + ]), + ]), + ...ExpandableBoxState.styles, + ]; +} diff --git a/lib/src/timeline/html/components/expandable_box.dart b/lib/src/timeline/html/components/expandable_box.dart new file mode 100644 index 00000000..cd83e74d --- /dev/null +++ b/lib/src/timeline/html/components/expandable_box.dart @@ -0,0 +1,80 @@ +// ignore_for_file: public_member_api_docs + +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' if (dart.library.io) '../web/web_stubs.dart'; + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; + +/// A box that can be expanded to show more content. +class ExpandableBox extends StatefulComponent { + const ExpandableBox({ + required this.title, + required this.content, + super.key, + }); + + final String title; + final String content; + + @override + State createState() => ExpandableBoxState(); +} + +class ExpandableBoxState extends State { + int? expandedTo; + + @override + Iterable build(BuildContext context) sync* { + final split = component.content.split('\n'); + + if (split.length > 1) { + yield div( + classes: "content", + styles: Styles.box(maxHeight: expandedTo?.px ?? 25.px), + [ + p([ + strong([text('${component.title}:')]), + text(' ${split.first} '), + pre([text(split.skip(1).join('\n'))]), + ]), + ]); + yield div( + classes: 'show-more', + events: { + 'click': (e) { + if (expandedTo != null) { + setState(() => expandedTo = null); + } else { + final contentHeight = (e.target as HtmlElement?) + ?.previousElementSibling + ?.scrollHeight; + setState(() => expandedTo = contentHeight); + } + }, + }, + [raw(expandedTo != null ? 'Show less ▲' : 'Show more ▼')], + ); + } else { + yield p([ + strong([text("${component.title}:")]), + text(" ${component.content} "), + ]); + } + } + + static List get styles => [ + css('.content').box( + overflow: Overflow.hidden, + transition: + const Transition('max-height', duration: 300, curve: Curve.ease), + ), + css('.show-more') // + .box(cursor: Cursor.pointer, display: Display.block) + .text(color: spotOrange) + .raw({ + 'background-color': + 'linear-gradient(to bottom, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 1) 100% )', + }), + ]; +} diff --git a/lib/src/timeline/html/components/modal.dart b/lib/src/timeline/html/components/modal.dart new file mode 100644 index 00000000..bcbab563 --- /dev/null +++ b/lib/src/timeline/html/components/modal.dart @@ -0,0 +1,196 @@ +// ignore_for_file: public_member_api_docs, avoid_dynamic_calls + +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' if (dart.library.io) '../web/web_stubs.dart'; + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; + +import 'package:spot/src/timeline/html/web/timeline_event.dart'; + +/// A modal to show a single event in detail. +class Modal extends StatefulComponent { + const Modal({required this.events, super.key}); + + final List events; + + @override + State createState() => ModalState(); +} + +class ModalState extends State { + int? _index; + + @override + void initState() { + super.initState(); + if (kIsWeb) { + /// Adds keyboard navigation to the modal. + window.onKeyDown.listen((event) { + if (event.key == 'Escape') { + close(); + event.preventDefault(); + event.stopPropagation(); + } else if (event.key == 'ArrowLeft') { + showPrev(); + event.preventDefault(); + event.stopPropagation(); + } else if (event.key == 'ArrowRight') { + showNext(); + event.preventDefault(); + event.stopPropagation(); + } + }); + } + } + + void open(TimelineEvent event) { + setState(() { + _index = component.events.indexOf(event); + }); + } + + void close() { + setState(() { + _index = null; + }); + } + + void showPrev() { + if (_index == null) return; + setState(() { + _index = (_index! - 1) % component.events.length; + }); + } + + void showNext() { + if (_index == null) return; + setState(() { + _index = (_index! + 1) % component.events.length; + }); + } + + TimelineEvent? get event => _index != null ? component.events[_index!] : null; + + @override + Iterable build(BuildContext context) sync* { + yield div( + classes: "modal ${_index != null ? 'show' : ''}", + events: events(onClick: close), + [ + span( + classes: "close", + events: events(onClick: close), + [raw("×")], + ), + div(classes: "modal-content", [ + img( + alt: "Screenshot of the Event", + src: event?.screenshotUrl ?? "", + ), + div(classes: "caption", [ + a( + classes: "nav nav-left", + events: { + 'click': (dynamic e) { + e.preventDefault(); + e.stopPropagation(); + showPrev(); + }, + }, + href: "", + [raw("❮")], + ), + div([text(event?.eventType ?? '')]), + a( + classes: "nav nav-right", + events: { + 'click': (dynamic e) { + e.preventDefault(); + e.stopPropagation(); + showNext(); + }, + }, + href: "", + [raw("❯")], + ), + ]), + ]), + ], + ); + } + + static List get styles => [ + css('.modal', [ + css('&') + .flexbox( + justifyContent: JustifyContent.center, + alignItems: AlignItems.center, + ) + .box( + display: Display.none, + position: const Position.fixed(left: Unit.zero, top: Unit.zero), + width: 100.percent, + height: 100.percent, + overflow: Overflow.auto, + ) + .background(color: modalBackgroundColor) + .raw({'z-index': '1'}), + css('&.show').box(display: Display.block), + css('img').box(maxWidth: 100.percent, height: Unit.auto), + css('span').background(color: Colors.transparent), + css('.modal-content') + .box( + margin: const EdgeInsets.all(Unit.auto), + display: Display.flex, + maxWidth: 80.percent, + height: Unit.auto, + border: const Border.all(BorderSide.none()), + position: const Position.relative(), + ) + .flexbox(direction: FlexDirection.column) + .background(color: Colors.transparent), + css('.close', [ + css('&') // + .box(position: Position.absolute(top: 15.px, right: 35.px)) + .text( + color: closeColor, + fontSize: closeFontSize, + fontWeight: FontWeight.bold, + ), + css('&:hover, &:focus') // + .box(cursor: Cursor.pointer) + .text(color: closeHoverColor, decoration: TextDecoration.none), + ]), + css('.nav', [ + css('&') + .box( + position: Position.absolute(top: 50.percent), + cursor: Cursor.pointer, + transform: Transform.translate(y: (-50).percent), + padding: + EdgeInsets.symmetric(vertical: 10.px, horizontal: 10.px), + margin: EdgeInsets.only(right: 5.px), + ) + .text( + color: navColor, + fontWeight: FontWeight.bold, + fontSize: navFontSize, + ) + .background(color: navBackgroundColor) + .raw({'user-select': 'none'}), + css('&:hover').text(color: navHoverColor), + css('&.nav-left').box(position: Position.absolute(left: (-50).px)), + css('&.nav-right') + .box(position: Position.absolute(right: (-50).px)), + ]), + css('.caption', [ + css('&') + .box(padding: captionPadding, height: 150.px) + .text(color: captionColor, align: TextAlign.center) + .background(color: Colors.transparent), + css('& div').background(color: Colors.transparent), + ]), + ]), + ]; +} diff --git a/lib/src/timeline/html/components/snackbar.dart b/lib/src/timeline/html/components/snackbar.dart new file mode 100644 index 00000000..505687ba --- /dev/null +++ b/lib/src/timeline/html/components/snackbar.dart @@ -0,0 +1,61 @@ +// ignore_for_file: public_member_api_docs + +import 'dart:async'; + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; + +/// A snackbar to show messages to the user. +class SnackBar extends StatefulComponent { + const SnackBar({super.key}); + + @override + State createState() => SnackBarState(); +} + +class SnackBarState extends State { + String? _message; + Timer? _timer; + + void show(String message) { + setState(() { + _message = message; + _timer?.cancel(); + _timer = Timer(const Duration(seconds: 3), () { + setState(() => _message = null); + }); + }); + } + + @override + Iterable build(BuildContext context) sync* { + yield div( + id: "snackbar", + classes: "snackbar ${_message != null ? 'show' : ''}", + [ + text(_message ?? ''), + ], + ); + } + + static List get styles => [ + css('.snackbar', [ + css('&') + .box( + display: Display.none, + minWidth: 250.px, + margin: EdgeInsets.only(left: (-125).px), + radius: BorderRadius.circular(2.px), + padding: EdgeInsets.all(16.px), + position: Position.fixed(left: 50.percent, bottom: 30.px), + ) + .background(color: snackbarBackgroundColor) + .text(color: snackbarColor, align: TextAlign.center) + .raw({'z-index': '1'}), + css('&.show').box(display: Display.block).raw({ + 'animation': 'fadein 0.5s, fadeout 0.5s 2.5s', + '-webkit-animation': 'fadein 0.5s, fadeout 0.5s 2.5s', + }), + ]), + ]; +} diff --git a/lib/src/timeline/html/components/timeline_app.dart b/lib/src/timeline/html/components/timeline_app.dart new file mode 100644 index 00000000..02762916 --- /dev/null +++ b/lib/src/timeline/html/components/timeline_app.dart @@ -0,0 +1,134 @@ +// ignore_for_file: public_member_api_docs + +/// This library is compiled for both vm and web platforms. +/// Therefore, this and all imported libraries need to be platform agnostic or stubbed. +library timeline_page; + +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' if (dart.library.io) '../web/web_stubs.dart' show window; + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/components/events.dart'; +import 'package:spot/src/timeline/html/components/modal.dart'; +import 'package:spot/src/timeline/html/components/snackbar.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; +import 'package:spot/src/timeline/html/web/timeline_event.dart'; + +/// The main entry point for the timeline web app. +class TimelineApp extends StatefulComponent { + const TimelineApp({ + required this.testName, + required this.testNameWithHierarchy, + required this.timelineEvents, + }); + + /// The name of the test. + final String testName; + + /// The name of the test with the hierarchy. + final String testNameWithHierarchy; + + /// The events that occurred during the test. + final List timelineEvents; + + @override + State createState() => TimelineAppState(); +} + +class TimelineAppState extends State { + // ignore: prefer_const_constructors + final GlobalKey _snackBar = GlobalKey(); + + // ignore: prefer_const_constructors + final GlobalKey _modal = GlobalKey(); + + @override + Iterable build(BuildContext context) { + return [ + div(classes: "header", [ + img( + src: + "https://user-images.githubusercontent.com/1096485/188243198-7abfc785-8ecd-40cb-bb28-5561610432a4.png", + height: 100, + ), + h1([text("Timeline")]), + ]), + div(classes: "horizontal-spacer", [ + h2([text("Info")]), + ]), + p([ + strong([text("Test:")]), + text(" ${component.testNameWithHierarchy}"), + ]), + button(classes: "button-spot", onClick: () async { + final command = 'flutter test --plain-name="${component.testName}"'; + try { + await window.navigator.clipboard?.writeText(command); + _snackBar.currentState!.show("Test command copied to clipboard"); + } catch (_) { + _snackBar.currentState!.show("Failed to copy test command"); + } + }, [ + text("Copy test command"), + ]), + SnackBar(key: _snackBar), + if (component.timelineEvents.isNotEmpty) ...[ + div(classes: "horizontal-spacer", [ + h2([text("Events")]), + ]), + section(classes: "events", [ + Events( + timeLineEvents: component.timelineEvents, + onClick: (event) { + _modal.currentState!.open(event); + }, + ), + ]), + ], + div([ + text("Tell us how to improve the timeline at "), + a( + href: "https://github.com/passsy/spot/issues", + [text("github.com/passsy/spot")], + ), + ]), + Modal(events: component.timelineEvents, key: _modal), + ]; + } + + static List get styles => [ + css('.button-spot', [ + css('&') + .box( + border: const Border.all(BorderSide.none()), + radius: BorderRadius.circular(4.px), + padding: + EdgeInsets.symmetric(vertical: 8.px, horizontal: 16.px), + cursor: Cursor.pointer, + transition: const Transition( + 'background-color', + duration: 300, + curve: Curve.ease, + ), + ) + .text(color: buttonColor, fontSize: 16.px) + .background(color: buttonBackgroundColor), + css('&:hover').background(color: buttonHoverBackgroundColor), + ]), + css('.horizontal-spacer', [ + css('&').box( + border: Border.only( + bottom: BorderSide.solid( + width: 1.px, + color: horizontalSpacerBorderColor, + ), + ), + padding: horizontalSpacerPadding, + ), + css('h2').box(margin: EdgeInsets.zero, padding: EdgeInsets.zero), + ]), + ...Events.styles, + ...SnackBarState.styles, + ...ModalState.styles, + ]; +} diff --git a/lib/src/timeline/html/print_html.dart b/lib/src/timeline/html/print_html.dart index 8a1208a7..bf0d9912 100644 --- a/lib/src/timeline/html/print_html.dart +++ b/lib/src/timeline/html/print_html.dart @@ -1,20 +1,22 @@ -// ignore_for_file: depend_on_referenced_packages -import 'dart:convert'; +// ignore_for_file: avoid_print import 'dart:io'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as flt; +import 'package:jaspr/server.dart' hide ServerApp; import 'package:spot/src/screenshot/screenshot.dart'; -import 'package:spot/src/timeline/html/script.js.dart'; -import 'package:spot/src/timeline/html/styles.css.dart'; +import 'package:spot/src/timeline/html/sources/script.js.g.dart'; +import 'package:spot/src/timeline/html/web/server_app.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; +import 'package:spot/src/timeline/html/web/timeline_event.dart' as x; import 'package:spot/src/timeline/timeline.dart'; import 'package:stack_trace/stack_trace.dart'; -//ignore: implementation_imports +// ignore: implementation_imports import 'package:test_api/src/backend/invoker.dart'; /// Writes the timeline as an HTML file extension HtmlTimelinePrinter on Timeline { /// Prints the timeline as an HTML file. - void printHTML() { + Future printHTML() async { final spotTempDir = Directory.systemTemp.createTempSync(); String name = test.test.name; @@ -52,254 +54,69 @@ extension HtmlTimelinePrinter on Timeline { }(); final htmlFile = File('${spotTempDir.path}/$nameForHtml'); - final content = _timelineAsHTML(timeLineEvents: events); - htmlFile.writeAsStringSync(content); - //ignore: avoid_print - print('View time line here: file://${htmlFile.path}'); - } -} - -/// Returns the events in the timeline as an HTML string. -String _timelineAsHTML({required List timeLineEvents}) { - final htmlBuffer = StringBuffer(); - final nameWithHierarchy = _testNameWithHierarchy(); - - htmlBuffer.writeln(''); - htmlBuffer.writeln(''); - htmlBuffer.writeln('Timeline Events'); - htmlBuffer.writeln( - '', - ); - - final String eventsForScript = - timeLineEvents.where((event) => event.screenshot != null).map((event) { - return '{' - 'src: "file://${event.screenshot!.file.path}", ' - 'title: "${event.eventType.label}", ' - 'color: "${event.eventType.color?.value.toRadixString(16) ?? '000000'}" ' - '}'; - }).join(',\n '); - - htmlBuffer.writeln(''); - - htmlBuffer.writeln(''); - - htmlBuffer.writeln(''); - htmlBuffer.writeln(''); - htmlBuffer.writeln('
'); - htmlBuffer.writeln( - '', - ); - htmlBuffer.writeln('

Timeline

'); - htmlBuffer.writeln('
'); - - htmlBuffer.writeln('

Info

'); - - htmlBuffer.writeln('

Test: $nameWithHierarchy

'); - htmlBuffer.writeln( - '', - ); - htmlBuffer.writeln('
'); - - if (timeLineEvents.isNotEmpty) { - htmlBuffer - .writeln('

Events

'); - } - - String? projectName() { - Directory? dir = Directory.current; - String? projectDir; - - while (dir != null) { - final ideaDir = Directory('${dir.path}/.idea'); - if (ideaDir.existsSync()) { - // Update to the current directory path - projectDir = dir.path; - break; + try { + final Stopwatch stopwatch = Stopwatch()..start(); + final content = await renderTimelineWithJaspr(this.events); + stopwatch.stop(); + if (stopwatch.elapsed > const Duration(seconds: 1)) { + print('Rendered HTML in ${stopwatch.elapsedMilliseconds}ms'); } - - // Move up to the parent directory - final parentDir = dir.parent; - if (dir.path == parentDir.path) { - // Reached the root directory - break; - } - dir = parentDir; - } - - if (projectDir == null) return null; - final name = projectDir.split('/').lastOrNull; - return name; - } - - String? eventCaller(Frame? initiator, {String? line}) { - if (initiator == null) return null; - - final memberPart = initiator.member != null ? '${initiator.member} ' : ''; - final uriPart = initiator.uri; - final linePart = line ?? initiator.line?.toString() ?? '0'; - final columnPart = initiator.column?.toString() ?? '0'; - - return '$memberPart$uriPart:$linePart:$columnPart'; - } - - String? jetBrainsURL(TimelineEvent event) { - final initiator = event.initiator; - if (initiator == null) return null; - - final isIntelliJ = Platform.environment.values.any( - (value) => value.toLowerCase().contains('intellij'), - ); - if (!isIntelliJ) return null; - - final lineNumber = (initiator.line ?? 0) - 1; - final clampedLine = lineNumber >= 0 ? lineNumber.toString() : '0'; - - final caller = eventCaller(initiator, line: clampedLine); - final name = projectName(); - if (caller == null || name == null) return null; - - final path = caller.trim().split(name).last.trim(); - if (path.isEmpty) return null; - - final normalizedPath = path.startsWith('/') ? path.substring(1) : path; - - return 'jetbrains://idea/navigate/reference?project=$name&path=$normalizedPath'; - } - - final eventBuffer = StringBuffer(); - - void writeScreenshot(TimelineEvent event) { - final index = timeLineEvents.indexOf(event); - final screenshot = event.screenshot != null - ? 'Screenshot' - : ''; - eventBuffer.writeln(screenshot); - } - - void writeExpandableBox({required String title, required String content}) { - final splitted = content.split('\n'); - - if (splitted.length > 1) { - eventBuffer.writeln('
'); - eventBuffer.writeln('

'); - eventBuffer.writeln( - '${_htmlEscape(title)}: ${_htmlEscape(splitted.first)} ', - ); - eventBuffer - .writeln('

${_htmlEscape(splitted.skip(1).join('\n'))}
'); - eventBuffer.writeln('

'); - eventBuffer.writeln('
'); - } else { - eventBuffer.writeln('

'); - eventBuffer.writeln( - '${_htmlEscape(title)}: ${_htmlEscape(content)} ', - ); - eventBuffer.writeln('

'); + htmlFile.writeAsStringSync(content); + print('View time line here: file://${htmlFile.path}'); + } catch (e, st) { + print('Error writing HTML file: $e $st'); } } +} - void writeEventType(TimelineEvent event) { - writeExpandableBox(title: 'Event Type', content: event.eventType.label); - } - - void writeDetails(TimelineEvent event) { - writeExpandableBox(title: 'Details', content: event.details); - } - - void writeTimestamp(TimelineEvent event) { - writeExpandableBox( - title: 'Timestamp', - content: event.timestamp.toIso8601String(), - ); - } - - void writeCaller(TimelineEvent event) { - final caller = eventCaller(event.initiator) ?? 'N/A'; - writeExpandableBox(title: 'Caller', content: caller); - } - - void writeJetBrainsLink(TimelineEvent event) { - final jetBrainsLink = jetBrainsURL(event); - if (jetBrainsLink == null) return; - eventBuffer.writeln(''); - eventBuffer.writeln( - ''); - eventBuffer.writeln(''); - } - - final events = () { - for (final event in timeLineEvents) { - eventBuffer.writeln( - '
', - ); - writeScreenshot(event); - eventBuffer.writeln('
'); - writeEventType(event); - writeDetails(event); - writeTimestamp(event); - - eventBuffer.writeln('
'); - writeCaller(event); - writeJetBrainsLink(event); - eventBuffer.writeln('
'); - - eventBuffer.writeln('
'); - eventBuffer.writeln('
'); - } - return eventBuffer.toString(); - }(); - - htmlBuffer.write('
'); - htmlBuffer.write(events); - htmlBuffer.write('
'); - - // footer - htmlBuffer.writeln( - '
Tell us how to improve the timeline at github.com/passsy/spot
', +/// Server-side renders the HTML timeline with Jaspr +Future renderTimelineWithJaspr(List events) async { + // Turn off isolate rendering. + Jaspr.initializeApp(useIsolates: false); + final nameWithHierarchy = testNameWithHierarchy(); + final html = await renderComponent( + Document( + title: "Timeline Events", + head: [ + link( + href: + "https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap", + rel: "stylesheet", + ), + DomComponent(tag: 'script', child: raw(timelineJS)), + DomComponent(tag: 'style', child: raw(animationsCSS)), + ], + styles: ServerAppState.styles, + body: ServerApp( + testName: Invoker.current!.liveTest.test.name, + testNameWithHierarchy: nameWithHierarchy, + timelineEvents: events + .map( + (e) => x.TimelineEvent( + eventType: e.eventType.label, + details: e.details, + timestamp: e.timestamp.toIso8601String(), + screenshotUrl: e.screenshot != null + ? 'file://${e.screenshot!.file.path}' + : null, + color: e.color == flt.Colors.grey + ? null + // ignore: deprecated_member_use + : e.color.value & 0xFFFFFF, + caller: _eventCaller(e.initiator) ?? 'N/A', + jetBrainsLink: _jetBrainsURL(e), + ), + ) + .toList(), + ), + ), ); - htmlBuffer.writeln(''); // close modal - htmlBuffer.writeln(''); - htmlBuffer.writeln(''); - - return htmlBuffer.toString(); -} - -String _htmlEscape(String text) { - const htmlEscape = HtmlEscape(HtmlEscapeMode.element); - return htmlEscape.convert(text); + return html; } /// Returns the test name including the group hierarchy. -String _testNameWithHierarchy() { +String testNameWithHierarchy() { final test = Invoker.current?.liveTest; if (test == null) { return 'No test found'; @@ -355,8 +172,63 @@ String _testNameWithHierarchy() { } } -extension on Color { - String toHex() { - return '#${value.toRadixString(16).padLeft(8, '0').substring(2)}'; +String? _projectName() { + Directory? dir = Directory.current; + String? projectDir; + + while (dir != null) { + final ideaDir = Directory('${dir.path}/.idea'); + if (ideaDir.existsSync()) { + // Update to the current directory path + projectDir = dir.path; + break; + } + + // Move up to the parent directory + final parentDir = dir.parent; + if (dir.path == parentDir.path) { + // Reached the root directory + break; + } + dir = parentDir; } + + if (projectDir == null) return null; + final name = projectDir.split('/').lastOrNull; + return name; +} + +String? _eventCaller(Frame? initiator, {String? line}) { + if (initiator == null) return null; + + final memberPart = initiator.member != null ? '${initiator.member} ' : ''; + final uriPart = initiator.uri; + final linePart = line ?? initiator.line?.toString() ?? '0'; + final columnPart = initiator.column?.toString() ?? '0'; + + return '$memberPart$uriPart:$linePart:$columnPart'; +} + +String? _jetBrainsURL(TimelineEvent event) { + final initiator = event.initiator; + if (initiator == null) return null; + + final isIntelliJ = Platform.environment.values.any( + (value) => value.toLowerCase().contains('intellij'), + ); + if (!isIntelliJ) return null; + + final lineNumber = (initiator.line ?? 0) - 1; + final clampedLine = lineNumber >= 0 ? lineNumber.toString() : '0'; + + final caller = _eventCaller(initiator, line: clampedLine); + final name = _projectName(); + if (caller == null || name == null) return null; + + final path = caller.trim().split(name).last.trim(); + if (path.isEmpty) return null; + + final normalizedPath = path.startsWith('/') ? path.substring(1) : path; + + return 'jetbrains://idea/navigate/reference?project=$name&path=$normalizedPath'; } diff --git a/lib/src/timeline/html/script.js.dart b/lib/src/timeline/html/script.js.dart deleted file mode 100644 index 794d5c16..00000000 --- a/lib/src/timeline/html/script.js.dart +++ /dev/null @@ -1,137 +0,0 @@ -// language=javascript -/// The script used in the HTML file that is generated for the timeline. -const String timelineJS = ''' - -let currentIndex = 0; -const events = [ - {{events}} -]; - -/** - * Copies the test command to the clipboard and shows a SnackBar with the result. - */ -function copyTestCommandToClipboard() { - var command = `flutter test --plain-name="{testName}"`; - navigator.clipboard.writeText(command).then(function() { - showSnackbar("Test command copied to clipboard"); - }, function(err) { - showSnackbar("Failed to copy test command"); - }); -} - -/** - * Displays a SnackBar with a specified message. - * @param {string} message - The message to display in the SnackBar. - */ -function showSnackbar(message) { - var snackbar = document.getElementById("snackbar"); - snackbar.textContent = message; - snackbar.className = "snackbar show"; - setTimeout(function() { - snackbar.className = snackbar.className.replace("show", ""); - }, 3000); -} - -/** - * Opens a modal to display an image and its caption. - * @param {number} index - The index of the image to display. - */ -function openModal(index) { - currentIndex = index; - var modal = document.getElementById("myModal"); - var modalImg = document.getElementById("img01"); - var captionText = document.getElementById("captionText"); - modal.style.display = "block"; - modalImg.src = events[index].src; - captionText.innerHTML = events[index].title; -} - -/** - * Closes the modal. - */ -function closeModal() { - var modal = document.getElementById("myModal"); - modal.style.display = "none"; -} - -/** - * Shows the previous image in the modal. - */ -function showPrev() { - currentIndex = (currentIndex + events.length - 1) % events.length; - updateModal(); -} - -/** - * Shows the next image in the modal. - */ -function showNext() { - currentIndex = (currentIndex + 1) % events.length; - updateModal(); -} - -/** - * Updates the modal content to display the current image and caption. - */ -function updateModal() { - var modalImg = document.getElementById("img01"); - var captionText = document.getElementById("captionText"); - modalImg.src = events[currentIndex].src; - captionText.innerHTML = events[currentIndex].title; -} - -/** - * Closes the modal when clicking outside of it. - * @param {Event} event - The event triggered by the click. - */ -window.onclick = function(event) { - var modal = document.getElementById("myModal"); - if (event.target == modal) { - modal.style.display = "none"; - } -} - -/** - * Adds keyboard navigation for the modal. - * @param {Event} event - The event triggered by the key press. - */ -window.addEventListener("keydown", function(event) { - if (event.key === "ArrowLeft") { - showPrev(); - event.preventDefault(); - event.stopPropagation(); - } else if (event.key === "ArrowRight") { - showNext(); - event.preventDefault(); - event.stopPropagation(); - } else if (event.key === "Escape") { - closeModal(); - event.preventDefault(); - event.stopPropagation(); - } -}); - -/** - * Expands or collapses the content when clicking the "Show more" button. - */ - document.addEventListener('DOMContentLoaded', function () { - const contentContainers = document.querySelectorAll('.content'); - - contentContainers.forEach((content, index) => { - const showMoreButton = document.createElement('div'); - showMoreButton.classList.add('show-more'); - showMoreButton.innerHTML = 'Show more ▼'; // Use ▲ for chevron-up - content.parentNode.insertBefore(showMoreButton, content.nextSibling); - - showMoreButton.addEventListener('click', function () { - if (content.style.maxHeight) { - content.style.maxHeight = null; - showMoreButton.innerHTML = 'Show more ▼'; - } else { - content.style.maxHeight = content.scrollHeight + 'px'; - showMoreButton.innerHTML = 'Show less ▲'; - } - }); - }); - }); -'''; diff --git a/lib/src/timeline/html/sources/script.js.g.dart b/lib/src/timeline/html/sources/script.js.g.dart new file mode 100644 index 00000000..ff1de0eb --- /dev/null +++ b/lib/src/timeline/html/sources/script.js.g.dart @@ -0,0 +1,6101 @@ +// AUTO GENERATED FILE. DO NOT MODIFY. + +/// The script used in the HTML file that is generated for the timeline. +/// Generate it with `dart run tool/compile_js.dart` +/// Using Dart SDK version: 3.6.0 (stable) (Thu Dec 5 07:46:24 2024 -0800) on "macos_arm64" + + +// language=javascript +const String timelineJS = r''' +(function dartProgram(){function copyProperties(a,b){var s=Object.keys(a) +for(var r=0;r=0)return true +if(typeof version=="function"&&version.length==0){var q=version() +if(/^\d+\.\d+\.\d+\.\d+$/.test(q))return true}}catch(p){}return false}() +function inherit(a,b){a.prototype.constructor=a +a.prototype["$i"+a.name]=a +if(b!=null){if(z){Object.setPrototypeOf(a.prototype,b.prototype) +return}var s=Object.create(b.prototype) +copyProperties(a.prototype,s) +a.prototype=s}}function inheritMany(a,b){for(var s=0;s4294967295)throw A.c(A.bA(a,0,4294967295,"length",null)) +return J.kq(new Array(a),b)}, +iy(a,b){if(a<0)throw A.c(A.ey("Length must be a non-negative integer: "+a,null)) +return A.f(new Array(a),b.h("z<0>"))}, +kq(a,b){var s=A.f(a,b.h("z<0>")) +s.$flags=1 +return s}, +kr(a,b){var s=t.e8 +return J.k0(s.a(a),s.a(b))}, +iz(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0 +default:return!1}switch(a){case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0 +default:return!1}}, +ks(a,b){var s,r +for(s=a.length;b0;b=r){r=b-1 +if(!(r>>0===b&&b").b(a))return new A.cu(a,b.h("@<0>").q(c).h("cu<1,2>")) +return new A.aY(a,b.h("@<0>").q(c).h("aY<1,2>"))}, +dv(a){return new A.aL("Local '"+a+"' has not been initialized.")}, +av(a,b){a=a+b&536870911 +a=a+((a&524287)<<10)&536870911 +return a^a>>>6}, +ft(a){a=a+((a&67108863)<<3)&536870911 +a^=a>>>11 +return a+((a&16383)<<15)&536870911}, +he(a,b,c){return a}, +i8(a){var s,r +for(s=$.a0.length,r=0;r"))}, +kw(a,b,c,d){if(t.gw.b(a))return new A.c_(a,b,c.h("@<0>").q(d).h("c_<1,2>")) +return new A.b8(a,b,c.h("@<0>").q(d).h("b8<1,2>"))}, +ix(){return new A.ck("No element")}, +aR:function aR(){}, +bX:function bX(a,b){this.a=a +this.$ti=b}, +aY:function aY(a,b){this.a=a +this.$ti=b}, +cu:function cu(a,b){this.a=a +this.$ti=b}, +ct:function ct(){}, +ao:function ao(a,b){this.a=a +this.$ti=b}, +aL:function aL(a){this.a=a}, +hq:function hq(){}, +fl:function fl(){}, +m:function m(){}, +H:function H(){}, +cn:function cn(a,b,c,d){var _=this +_.a=a +_.b=b +_.c=c +_.$ti=d}, +au:function au(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +b8:function b8(a,b,c){this.a=a +this.b=b +this.$ti=c}, +c_:function c_(a,b,c){this.a=a +this.b=b +this.$ti=c}, +c8:function c8(a,b,c){var _=this +_.a=null +_.b=a +_.c=b +_.$ti=c}, +ac:function ac(a,b,c){this.a=a +this.b=b +this.$ti=c}, +aA:function aA(a,b,c){this.a=a +this.b=b +this.$ti=c}, +cq:function cq(a,b,c){this.a=a +this.b=b +this.$ti=c}, +co:function co(){}, +bF:function bF(){}, +cf:function cf(a,b){this.a=a +this.$ti=b}, +cO:function cO(){}, +jB(a){var s=v.mangledGlobalNames[a] +if(s!=null)return s +return"minified:"+a}, +ml(a,b){var s +if(b!=null){s=b.x +if(s!=null)return s}return t.aU.b(a)}, +l(a){var s +if(typeof a=="string")return a +if(typeof a=="number"){if(a!==0)return""+a}else if(!0===a)return"true" +else if(!1===a)return"false" +else if(a==null)return"null" +s=J.am(a) +return s}, +dB(a){var s,r=$.iF +if(r==null)r=$.iF=Symbol("identityHashCode") +s=a[r] +if(s==null){s=Math.random()*0x3fffffff|0 +a[r]=s}return s}, +fg(a){return A.kB(a)}, +kB(a){var s,r,q,p +if(a instanceof A.o)return A.L(A.a9(a),null) +s=J.bj(a) +if(s===B.a1||s===B.a3||t.ak.b(a)){r=B.l(a) +if(r!=="Object"&&r!=="")return r +q=a.constructor +if(typeof q=="function"){p=q.name +if(typeof p=="string"&&p!=="Object"&&p!=="")return p}}return A.L(A.a9(a),null)}, +kK(a){if(a==null||typeof a=="number"||A.hZ(a))return J.am(a) +if(typeof a=="string")return JSON.stringify(a) +if(a instanceof A.aH)return a.i(0) +if(a instanceof A.ef)return a.eb(!0) +return"Instance of '"+A.fg(a)+"'"}, +by(a){if(a.date===void 0)a.date=new Date(a.a) +return a.date}, +kJ(a){var s=A.by(a).getUTCFullYear()+0 +return s}, +kH(a){var s=A.by(a).getUTCMonth()+1 +return s}, +kD(a){var s=A.by(a).getUTCDate()+0 +return s}, +kE(a){var s=A.by(a).getUTCHours()+0 +return s}, +kG(a){var s=A.by(a).getUTCMinutes()+0 +return s}, +kI(a){var s=A.by(a).getUTCSeconds()+0 +return s}, +kF(a){var s=A.by(a).getUTCMilliseconds()+0 +return s}, +kC(a){var s=a.$thrownJsError +if(s==null)return null +return A.ae(s)}, +iG(a,b){var s +if(a.$thrownJsError==null){s=A.c(a) +a.$thrownJsError=s +s.stack=b.i(0)}}, +me(a){throw A.c(A.m0(a))}, +n(a,b){if(a==null)J.ah(a) +throw A.c(A.i4(a,b))}, +i4(a,b){var s,r="index" +if(!A.jg(b))return new A.a3(!0,b,r,null) +s=A.cP(J.ah(a)) +if(b<0||b>=s)return A.bp(b,s,a,r) +return A.kM(b,r)}, +m0(a){return new A.a3(!0,a,null,null)}, +c(a){return A.ju(new Error(),a)}, +ju(a,b){var s +if(b==null)b=new A.ax() +a.dartException=b +s=A.mv +if("defineProperty" in Object){Object.defineProperty(a,"message",{get:s}) +a.name=""}else a.toString=s +return a}, +mv(){return J.am(this.dartException)}, +bl(a){throw A.c(a)}, +ht(a,b){throw A.ju(b,a)}, +d_(a,b,c){var s +if(b==null)b=0 +if(c==null)c=0 +s=Error() +A.ht(A.lv(a,b,c),s)}, +lv(a,b,c){var s,r,q,p,o,n,m,l,k +if(typeof b=="string")s=b +else{r="[]=;add;removeWhere;retainWhere;removeRange;setRange;setInt8;setInt16;setInt32;setUint8;setUint16;setUint32;setFloat32;setFloat64".split(";") +q=r.length +p=b +if(p>q){c=p/q|0 +p%=q}s=r[p]}o=typeof c=="string"?c:"modify;remove from;add to".split(";")[c] +n=t.j.b(a)?"list":"ByteData" +m=a.$flags|0 +l="a " +if((m&4)!==0)k="constant " +else if((m&2)!==0){k="unmodifiable " +l="an "}else k=(m&1)!==0?"fixed-length ":"" +return new A.cp("'"+s+"': Cannot "+o+" "+l+k+n)}, +al(a){throw A.c(A.R(a))}, +ay(a){var s,r,q,p,o,n +a=A.mq(a.replace(String({}),"$receiver$")) +s=a.match(/\\\$[a-zA-Z]+\\\$/g) +if(s==null)s=A.f([],t.s) +r=s.indexOf("\\$arguments\\$") +q=s.indexOf("\\$argumentsExpr\\$") +p=s.indexOf("\\$expr\\$") +o=s.indexOf("\\$method\\$") +n=s.indexOf("\\$receiver\\$") +return new A.fw(a.replace(new RegExp("\\\\\\$arguments\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$","g"),"((?:x|[^x])*)"),r,q,p,o,n)}, +fx(a){return function($expr$){var $argumentsExpr$="$arguments$" +try{$expr$.$method$($argumentsExpr$)}catch(s){return s.message}}(a)}, +iN(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)}, +hI(a,b){var s=b==null,r=s?null:b.method +return new A.du(a,r,s?null:b.receiver)}, +a1(a){var s +if(a==null)return new A.fe(a) +if(a instanceof A.c0){s=a.a +return A.aV(a,s==null?t.K.a(s):s)}if(typeof a!=="object")return a +if("dartException" in a)return A.aV(a,a.dartException) +return A.m_(a)}, +aV(a,b){if(t.C.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a +return b}, +m_(a){var s,r,q,p,o,n,m,l,k,j,i,h,g +if(!("message" in a))return a +s=a.message +if("number" in a&&typeof a.number=="number"){r=a.number +q=r&65535 +if((B.c.dc(r,16)&8191)===10)switch(q){case 438:return A.aV(a,A.hI(A.l(s)+" (Error "+q+")",null)) +case 445:case 5007:A.l(s) +return A.aV(a,new A.ca())}}if(a instanceof TypeError){p=$.jH() +o=$.jI() +n=$.jJ() +m=$.jK() +l=$.jN() +k=$.jO() +j=$.jM() +$.jL() +i=$.jQ() +h=$.jP() +g=p.N(s) +if(g!=null)return A.aV(a,A.hI(A.D(s),g)) +else{g=o.N(s) +if(g!=null){g.method="call" +return A.aV(a,A.hI(A.D(s),g))}else if(n.N(s)!=null||m.N(s)!=null||l.N(s)!=null||k.N(s)!=null||j.N(s)!=null||m.N(s)!=null||i.N(s)!=null||h.N(s)!=null){A.D(s) +return A.aV(a,new A.ca())}}return A.aV(a,new A.dQ(typeof s=="string"?s:""))}if(a instanceof RangeError){if(typeof s=="string"&&s.indexOf("call stack")!==-1)return new A.cj() +s=function(b){try{return String(b)}catch(f){}return null}(a) +return A.aV(a,new A.a3(!1,null,null,typeof s=="string"?s.replace(/^RangeError:\s*/,""):s))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof s=="string"&&s==="too much recursion")return new A.cj() +return a}, +ae(a){var s +if(a instanceof A.c0)return a.b +if(a==null)return new A.cG(a) +s=a.$cachedTrace +if(s!=null)return s +s=new A.cG(a) +if(typeof a==="object")a.$cachedTrace=s +return s}, +jw(a){if(a==null)return J.a2(a) +if(typeof a=="object")return A.dB(a) +return J.a2(a)}, +m9(a,b){var s,r,q,p=a.length +for(s=0;s=0}, +mq(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$|]/g,"\\$&") +return a}, +jm(a){return a}, +ms(a,b,c,d){var s,r,q,p=new A.dT(b,a,0),o=t.cz,n=0,m="" +for(;p.l();){s=p.d +if(s==null)s=o.a(s) +r=s.b +q=r.index +m=m+A.l(A.jm(B.d.aS(a,n,q)))+A.l(c.$1(s)) +n=q+r[0].length}p=m+A.l(A.jm(B.d.cu(a,n))) +return p.charCodeAt(0)==0?p:p}, +bY:function bY(){}, +bZ:function bZ(a,b,c){this.a=a +this.b=b +this.$ti=c}, +cB:function cB(a,b){this.a=a +this.$ti=b}, +cC:function cC(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +fw:function fw(a,b,c,d,e,f){var _=this +_.a=a +_.b=b +_.c=c +_.d=d +_.e=e +_.f=f}, +ca:function ca(){}, +du:function du(a,b,c){this.a=a +this.b=b +this.c=c}, +dQ:function dQ(a){this.a=a}, +fe:function fe(a){this.a=a}, +c0:function c0(a,b){this.a=a +this.b=b}, +cG:function cG(a){this.a=a +this.b=null}, +aH:function aH(){}, +d9:function d9(){}, +da:function da(){}, +dM:function dM(){}, +dH:function dH(){}, +bn:function bn(a,b){this.a=a +this.b=b}, +e2:function e2(a){this.a=a}, +dE:function dE(a){this.a=a}, +dV:function dV(a){this.a=a}, +ar:function ar(a){var _=this +_.a=0 +_.f=_.e=_.d=_.c=_.b=null +_.r=0 +_.$ti=a}, +eX:function eX(a){this.a=a}, +f_:function f_(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, +at:function at(a,b){this.a=a +this.$ti=b}, +c7:function c7(a,b,c){var _=this +_.a=a +_.b=b +_.d=_.c=null +_.$ti=c}, +hj:function hj(a){this.a=a}, +hk:function hk(a){this.a=a}, +hl:function hl(a){this.a=a}, +ef:function ef(){}, +dt:function dt(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, +cD:function cD(a){this.b=a}, +dT:function dT(a,b,c){var _=this +_.a=a +_.b=b +_.c=c +_.d=null}, +mt(a){A.ht(new A.aL("Field '"+a+"' has been assigned during initialization."),new Error())}, +cZ(){A.ht(new A.aL("Field '' has not been initialized."),new Error())}, +hu(){A.ht(new A.aL("Field '' has already been initialized."),new Error())}, +iS(){var s=new A.fD() +return s.b=s}, +fD:function fD(){this.b=null}, +iJ(a,b){var s=b.c +return s==null?b.c=A.hW(a,b.x,!0):s}, +hN(a,b){var s=b.c +return s==null?b.c=A.cK(a,"X",[b.x]):s}, +iK(a){var s=a.w +if(s===6||s===7||s===8)return A.iK(a.x) +return s===12||s===13}, +kQ(a){return a.as}, +cX(a){return A.eo(v.typeUniverse,a,!1)}, +aT(a1,a2,a3,a4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=a2.w +switch(a0){case 5:case 1:case 2:case 3:case 4:return a2 +case 6:s=a2.x +r=A.aT(a1,s,a3,a4) +if(r===s)return a2 +return A.j6(a1,r,!0) +case 7:s=a2.x +r=A.aT(a1,s,a3,a4) +if(r===s)return a2 +return A.hW(a1,r,!0) +case 8:s=a2.x +r=A.aT(a1,s,a3,a4) +if(r===s)return a2 +return A.j4(a1,r,!0) +case 9:q=a2.y +p=A.bP(a1,q,a3,a4) +if(p===q)return a2 +return A.cK(a1,a2.x,p) +case 10:o=a2.x +n=A.aT(a1,o,a3,a4) +m=a2.y +l=A.bP(a1,m,a3,a4) +if(n===o&&l===m)return a2 +return A.hU(a1,n,l) +case 11:k=a2.x +j=a2.y +i=A.bP(a1,j,a3,a4) +if(i===j)return a2 +return A.j5(a1,k,i) +case 12:h=a2.x +g=A.aT(a1,h,a3,a4) +f=a2.y +e=A.lX(a1,f,a3,a4) +if(g===h&&e===f)return a2 +return A.j3(a1,g,e) +case 13:d=a2.y +a4+=d.length +c=A.bP(a1,d,a3,a4) +o=a2.x +n=A.aT(a1,o,a3,a4) +if(c===d&&n===o)return a2 +return A.hV(a1,n,c,!0) +case 14:b=a2.x +if(b=p)return A.n(q,0) +s=A.cM(v.typeUniverse,A.i0(q[0]),"@<0>") +for(r=1;r=0)p+=" "+r[q];++q}return p+"})"}, +jd(a4,a5,a6){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2=", ",a3=null +if(a6!=null){s=a6.length +if(a5==null)a5=A.f([],t.s) +else a3=a5.length +r=a5.length +for(q=s;q>0;--q)B.a.t(a5,"T"+(r+q)) +for(p=t.cK,o=t._,n="<",m="",q=0;q=0))return A.n(a5,k) +n=n+m+a5[k] +j=a6[q] +i=j.w +if(!(i===2||i===3||i===4||i===5||j===p))l=j===o +else l=!0 +if(!l)n+=" extends "+A.L(j,a5)}n+=">"}else n="" +p=a4.x +h=a4.y +g=h.a +f=g.length +e=h.b +d=e.length +c=h.c +b=c.length +a=A.L(p,a5) +for(a0="",a1="",q=0;q0){a0+=a1+"[" +for(a1="",q=0;q0){a0+=a1+"{" +for(a1="",q=0;q "+a}, +L(a,b){var s,r,q,p,o,n,m,l=a.w +if(l===5)return"erased" +if(l===2)return"dynamic" +if(l===3)return"void" +if(l===1)return"Never" +if(l===4)return"any" +if(l===6)return A.L(a.x,b) +if(l===7){s=a.x +r=A.L(s,b) +q=s.w +return(q===12||q===13?"("+r+")":r)+"?"}if(l===8)return"FutureOr<"+A.L(a.x,b)+">" +if(l===9){p=A.lZ(a.x) +o=a.y +return o.length>0?p+("<"+A.jk(o,b)+">"):p}if(l===11)return A.lS(a,b) +if(l===12)return A.jd(a,b,null) +if(l===13)return A.jd(a.x,b,a.y) +if(l===14){n=a.x +m=b.length +n=m-1-n +if(!(n>=0&&n0)p+="<"+A.cJ(c)+">" +s=a.eC.get(p) +if(s!=null)return s +r=new A.a6(null,null) +r.w=9 +r.x=b +r.y=c +if(c.length>0)r.c=c[0] +r.as=p +q=A.aE(a,r) +a.eC.set(p,q) +return q}, +hU(a,b,c){var s,r,q,p,o,n +if(b.w===10){s=b.x +r=b.y.concat(c)}else{r=c +s=b}q=s.as+(";<"+A.cJ(r)+">") +p=a.eC.get(q) +if(p!=null)return p +o=new A.a6(null,null) +o.w=10 +o.x=s +o.y=r +o.as=q +n=A.aE(a,o) +a.eC.set(q,n) +return n}, +j5(a,b,c){var s,r,q="+"+(b+"("+A.cJ(c)+")"),p=a.eC.get(q) +if(p!=null)return p +s=new A.a6(null,null) +s.w=11 +s.x=b +s.y=c +s.as=q +r=A.aE(a,s) +a.eC.set(q,r) +return r}, +j3(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g="("+A.cJ(m) +if(j>0){s=l>0?",":"" +g+=s+"["+A.cJ(k)+"]"}if(h>0){s=l>0?",":"" +g+=s+"{"+A.lb(i)+"}"}r=n+(g+")") +q=a.eC.get(r) +if(q!=null)return q +p=new A.a6(null,null) +p.w=12 +p.x=b +p.y=c +p.as=r +o=A.aE(a,p) +a.eC.set(r,o) +return o}, +hV(a,b,c,d){var s,r=b.as+("<"+A.cJ(c)+">"),q=a.eC.get(r) +if(q!=null)return q +s=A.ld(a,b,c,r,d) +a.eC.set(r,s) +return s}, +ld(a,b,c,d,e){var s,r,q,p,o,n,m,l +if(e){s=c.length +r=A.h0(s) +for(q=0,p=0;p0){n=A.aT(a,b,r,0) +m=A.bP(a,c,r,0) +return A.hV(a,n,m,c!==m)}}l=new A.a6(null,null) +l.w=13 +l.x=b +l.y=c +l.as=d +return A.aE(a,l)}, +iY(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, +j_(a){var s,r,q,p,o,n,m,l=a.r,k=a.s +for(s=l.length,r=0;r=48&&q<=57)r=A.l4(r+1,q,l,k) +else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.iZ(a,r,l,k,!1) +else if(q===46)r=A.iZ(a,r,l,k,!0) +else{++r +switch(q){case 44:break +case 58:k.push(!1) +break +case 33:k.push(!0) +break +case 59:k.push(A.aS(a.u,a.e,k.pop())) +break +case 94:k.push(A.lg(a.u,k.pop())) +break +case 35:k.push(A.cL(a.u,5,"#")) +break +case 64:k.push(A.cL(a.u,2,"@")) +break +case 126:k.push(A.cL(a.u,3,"~")) +break +case 60:k.push(a.p) +a.p=k.length +break +case 62:A.l6(a,k) +break +case 38:A.l5(a,k) +break +case 42:p=a.u +k.push(A.j6(p,A.aS(p,a.e,k.pop()),a.n)) +break +case 63:p=a.u +k.push(A.hW(p,A.aS(p,a.e,k.pop()),a.n)) +break +case 47:p=a.u +k.push(A.j4(p,A.aS(p,a.e,k.pop()),a.n)) +break +case 40:k.push(-3) +k.push(a.p) +a.p=k.length +break +case 41:A.l3(a,k) +break +case 91:k.push(a.p) +a.p=k.length +break +case 93:o=k.splice(a.p) +A.j0(a.u,a.e,o) +a.p=k.pop() +k.push(o) +k.push(-1) +break +case 123:k.push(a.p) +a.p=k.length +break +case 125:o=k.splice(a.p) +A.l8(a.u,a.e,o) +a.p=k.pop() +k.push(o) +k.push(-2) +break +case 43:n=l.indexOf("(",r) +k.push(l.substring(r,n)) +k.push(-4) +k.push(a.p) +a.p=k.length +r=n+1 +break +default:throw"Bad character "+q}}}m=k.pop() +return A.aS(a.u,a.e,m)}, +l4(a,b,c,d){var s,r,q=b-48 +for(s=c.length;a=48&&r<=57))break +q=q*10+(r-48)}d.push(q) +return a}, +iZ(a,b,c,d,e){var s,r,q,p,o,n,m=b+1 +for(s=c.length;m>>0)-97&65535)<26||r===95||r===36||r===124))q=r>=48&&r<=57 +else q=!0 +if(!q)break}}p=c.substring(b,m) +if(e){s=a.u +o=a.e +if(o.w===10)o=o.x +n=A.lk(s,o.x)[p] +if(n==null)A.bl('No "'+p+'" in "'+A.kQ(o)+'"') +d.push(A.cM(s,o,n))}else d.push(p) +return m}, +l6(a,b){var s,r=a.u,q=A.iX(a,b),p=b.pop() +if(typeof p=="string")b.push(A.cK(r,p,q)) +else{s=A.aS(r,a.e,p) +switch(s.w){case 12:b.push(A.hV(r,s,q,a.n)) +break +default:b.push(A.hU(r,s,q)) +break}}}, +l3(a,b){var s,r,q,p=a.u,o=b.pop(),n=null,m=null +if(typeof o=="number")switch(o){case-1:n=b.pop() +break +case-2:m=b.pop() +break +default:b.push(o) +break}else b.push(o) +s=A.iX(a,b) +o=b.pop() +switch(o){case-3:o=b.pop() +if(n==null)n=p.sEA +if(m==null)m=p.sEA +r=A.aS(p,a.e,o) +q=new A.e7() +q.a=s +q.b=n +q.c=m +b.push(A.j3(p,r,q)) +return +case-4:b.push(A.j5(p,b.pop(),s)) +return +default:throw A.c(A.d4("Unexpected state under `()`: "+A.l(o)))}}, +l5(a,b){var s=b.pop() +if(0===s){b.push(A.cL(a.u,1,"0&")) +return}if(1===s){b.push(A.cL(a.u,4,"1&")) +return}throw A.c(A.d4("Unexpected extended operation "+A.l(s)))}, +iX(a,b){var s=b.splice(a.p) +A.j0(a.u,a.e,s) +a.p=b.pop() +return s}, +aS(a,b,c){if(typeof c=="string")return A.cK(a,c,a.sEA) +else if(typeof c=="number"){b.toString +return A.l7(a,b,c)}else return c}, +j0(a,b,c){var s,r=c.length +for(s=0;sn)return!1 +m=n-o +l=s.b +k=r.b +j=l.length +i=k.length +if(o+j=d)return!1 +a1=f[b] +b+=3 +if(a00?new Array(q):v.typeUniverse.sEA +for(o=0;o0?new Array(a):v.typeUniverse.sEA}, +a6:function a6(a,b){var _=this +_.a=a +_.b=b +_.r=_.f=_.d=_.c=null +_.w=0 +_.as=_.Q=_.z=_.y=_.x=null}, +e7:function e7(){this.c=this.b=this.a=null}, +em:function em(a){this.a=a}, +e4:function e4(){}, +cI:function cI(a){this.a=a}, +kW(){var s,r,q={} +if(self.scheduleImmediate!=null)return A.m2() +if(self.MutationObserver!=null&&self.document!=null){s=self.document.createElement("div") +r=self.document.createElement("span") +q.a=null +new self.MutationObserver(A.aU(new A.fA(q),1)).observe(s,{childList:true}) +return new A.fz(q,s,r)}else if(self.setImmediate!=null)return A.m3() +return A.m4()}, +kX(a){self.scheduleImmediate(A.aU(new A.fB(t.M.a(a)),0))}, +kY(a){self.setImmediate(A.aU(new A.fC(t.M.a(a)),0))}, +kZ(a){A.hO(B.J,t.M.a(a))}, +hO(a,b){return A.la(a.a/1000|0,b)}, +la(a,b){var s=new A.el() +s.cI(a,b) +return s}, +cV(a){return new A.dW(new A.u($.r,a.h("u<0>")),a.h("dW<0>"))}, +cS(a,b){a.$2(0,null) +b.b=!0 +return b.a}, +eu(a,b){A.ls(a,b)}, +cR(a,b){b.bd(0,a)}, +cQ(a,b){b.be(A.a1(a),A.ae(a))}, +ls(a,b){var s,r,q=new A.h2(b),p=new A.h3(b) +if(a instanceof A.u)a.bW(q,p,t.z) +else{s=t.z +if(a instanceof A.u)a.bo(q,p,s) +else{r=new A.u($.r,t.c) +r.a=8 +r.c=a +r.bW(q,p,s)}}}, +cW(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e) +break}catch(r){e=r +d=c}}}}(a,1) +return $.r.ce(new A.hc(s),t.H,t.S,t.z)}, +j1(a,b,c){return 0}, +hA(a){var s +if(t.C.b(a)){s=a.ga7() +if(s!=null)return s}return B.j}, +je(a,b){if($.r===B.b)return null +return null}, +lD(a,b){if($.r!==B.b)A.je(a,b) +if(b==null)if(t.C.b(a)){b=a.ga7() +if(b==null){A.iG(a,B.j) +b=B.j}}else b=B.j +else if(t.C.b(a))A.iG(a,b) +return new A.an(a,b)}, +iU(a,b){var s,r,q +for(s=t.c;r=a.a,(r&4)!==0;)a=s.a(a.c) +if(a===b){b.av(new A.a3(!0,a,null,"Cannot complete a future with itself"),A.iL()) +return}s=r|b.a&1 +a.a=s +if((s&24)!==0){q=b.aB() +b.aw(a) +A.bL(b,q)}else{q=t.F.a(b.c) +b.bU(a) +a.ba(q)}}, +l0(a,b){var s,r,q,p={},o=p.a=a +for(s=t.c;r=o.a,(r&4)!==0;o=a){a=s.a(o.c) +p.a=a}if(o===b){b.av(new A.a3(!0,o,null,"Cannot complete a future with itself"),A.iL()) +return}if((r&24)===0){q=t.F.a(b.c) +b.bU(o) +p.a.ba(q) +return}if((r&16)===0&&b.c==null){b.aw(o) +return}b.a^=2 +A.bO(null,null,b.b,t.M.a(new A.fM(p,b)))}, +bL(a,a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c={},b=c.a=a +for(s=t.n,r=t.F,q=t.b9;!0;){p={} +o=b.a +n=(o&16)===0 +m=!n +if(a0==null){if(m&&(o&1)===0){l=s.a(b.c) +A.ha(l.a,l.b)}return}p.a=a0 +k=a0.a +for(b=a0;k!=null;b=k,k=j){b.a=null +A.bL(c.a,b) +p.a=k +j=k.a}o=c.a +i=o.c +p.b=m +p.c=i +if(n){h=b.c +h=(h&1)!==0||(h&15)===8}else h=!0 +if(h){g=b.b.b +if(m){o=o.b===g +o=!(o||o)}else o=!1 +if(o){s.a(i) +A.ha(i.a,i.b) +return}f=$.r +if(f!==g)$.r=g +else f=null +b=b.c +if((b&15)===8)new A.fT(p,c,m).$0() +else if(n){if((b&1)!==0)new A.fS(p,i).$0()}else if((b&2)!==0)new A.fR(c,p).$0() +if(f!=null)$.r=f +b=p.c +if(b instanceof A.u){o=p.a.$ti +o=o.h("X<2>").b(b)||!o.y[1].b(b)}else o=!1 +if(o){q.a(b) +e=p.a.b +if((b.a&24)!==0){d=r.a(e.c) +e.c=null +a0=e.aC(d) +e.a=b.a&30|e.a&1 +e.c=b.c +c.a=b +continue}else A.iU(b,e) +return}}e=p.a.b +d=r.a(e.c) +e.c=null +a0=e.aC(d) +b=p.b +o=p.c +if(!b){e.$ti.c.a(o) +e.a=8 +e.c=o}else{s.a(o) +e.a=e.a&1|16 +e.c=o}c.a=e +b=e}}, +lT(a,b){var s +if(t.R.b(a))return b.ce(a,t.z,t.K,t.l) +s=t.v +if(s.b(a))return s.a(a) +throw A.c(A.im(a,"onError",u.c))}, +lQ(){var s,r +for(s=$.bN;s!=null;s=$.bN){$.cU=null +r=s.b +$.bN=r +if(r==null)$.cT=null +s.a.$0()}}, +lW(){$.i_=!0 +try{A.lQ()}finally{$.cU=null +$.i_=!1 +if($.bN!=null)$.id().$1(A.jp())}}, +jl(a){var s=new A.dX(a),r=$.cT +if(r==null){$.bN=$.cT=s +if(!$.i_)$.id().$1(A.jp())}else $.cT=r.b=s}, +lV(a){var s,r,q,p=$.bN +if(p==null){A.jl(a) +$.cU=$.cT +return}s=new A.dX(a) +r=$.cU +if(r==null){s.b=p +$.bN=$.cU=s}else{q=r.b +s.b=q +$.cU=r.b=s +if(q==null)$.cT=s}}, +jA(a){var s=null,r=$.r +if(B.b===r){A.bO(s,s,B.b,a) +return}A.bO(s,s,r,t.M.a(r.bc(a)))}, +mO(a,b){A.he(a,"stream",t.K) +return new A.ei(b.h("ei<0>"))}, +lt(a,b,c){var s,r,q=a.aI(),p=$.jG() +if(q!==p){s=t.O.a(new A.h8(b,c)) +p=q.$ti +r=$.r +q.au(new A.aB(new A.u(r,p),8,s,null,p.h("aB<1,1>")))}else b.b0(c)}, +kV(a,b){var s=$.r +if(s===B.b)return A.hO(a,t.M.a(b)) +return A.hO(a,t.M.a(s.bc(b)))}, +ha(a,b){A.lV(new A.hb(a,b))}, +ji(a,b,c,d,e){var s,r=$.r +if(r===c)return d.$0() +$.r=c +s=r +try{r=d.$0() +return r}finally{$.r=s}}, +jj(a,b,c,d,e,f,g){var s,r=$.r +if(r===c)return d.$1(e) +$.r=c +s=r +try{r=d.$1(e) +return r}finally{$.r=s}}, +lU(a,b,c,d,e,f,g,h,i){var s,r=$.r +if(r===c)return d.$2(e,f) +$.r=c +s=r +try{r=d.$2(e,f) +return r}finally{$.r=s}}, +bO(a,b,c,d){t.M.a(d) +if(B.b!==c)d=c.bc(d) +A.jl(d)}, +fA:function fA(a){this.a=a}, +fz:function fz(a,b,c){this.a=a +this.b=b +this.c=c}, +fB:function fB(a){this.a=a}, +fC:function fC(a){this.a=a}, +el:function el(){this.b=null}, +h_:function h_(a,b){this.a=a +this.b=b}, +dW:function dW(a,b){this.a=a +this.b=!1 +this.$ti=b}, +h2:function h2(a){this.a=a}, +h3:function h3(a){this.a=a}, +hc:function hc(a){this.a=a}, +cH:function cH(a,b){var _=this +_.a=a +_.e=_.d=_.c=_.b=null +_.$ti=b}, +U:function U(a,b){this.a=a +this.$ti=b}, +an:function an(a,b){this.a=a +this.b=b}, +e1:function e1(){}, +cs:function cs(a,b){this.a=a +this.$ti=b}, +aB:function aB(a,b,c,d,e){var _=this +_.a=null +_.b=a +_.c=b +_.d=c +_.e=d +_.$ti=e}, +u:function u(a,b){var _=this +_.a=0 +_.b=a +_.c=null +_.$ti=b}, +fJ:function fJ(a,b){this.a=a +this.b=b}, +fQ:function fQ(a,b){this.a=a +this.b=b}, +fN:function fN(a){this.a=a}, +fO:function fO(a){this.a=a}, +fP:function fP(a,b,c){this.a=a +this.b=b +this.c=c}, +fM:function fM(a,b){this.a=a +this.b=b}, +fL:function fL(a,b){this.a=a +this.b=b}, +fK:function fK(a,b,c){this.a=a +this.b=b +this.c=c}, +fT:function fT(a,b,c){this.a=a +this.b=b +this.c=c}, +fU:function fU(a){this.a=a}, +fS:function fS(a,b){this.a=a +this.b=b}, +fR:function fR(a,b){this.a=a +this.b=b}, +dX:function dX(a){this.a=a +this.b=null}, +cm:function cm(){}, +fr:function fr(a,b){this.a=a +this.b=b}, +fs:function fs(a,b){this.a=a +this.b=b}, +fp:function fp(a){this.a=a}, +fq:function fq(a,b,c){this.a=a +this.b=b +this.c=c}, +ei:function ei(a){this.$ti=a}, +h8:function h8(a,b){this.a=a +this.b=b}, +cN:function cN(){}, +hb:function hb(a,b){this.a=a +this.b=b}, +eh:function eh(){}, +fY:function fY(a,b){this.a=a +this.b=b}, +fZ:function fZ(a,b,c){this.a=a +this.b=b +this.c=c}, +km(a,b){return new A.cx(a.h("@<0>").q(b).h("cx<1,2>"))}, +iV(a,b){var s=a[b] +return s===a?null:s}, +hR(a,b,c){if(c==null)a[b]=a +else a[b]=c}, +hQ(){var s=Object.create(null) +A.hR(s,"",s) +delete s[""] +return s}, +ku(a,b){return new A.ar(a.h("@<0>").q(b).h("ar<1,2>"))}, +dw(a,b,c){return b.h("@<0>").q(c).h("iB<1,2>").a(A.m9(a,new A.ar(b.h("@<0>").q(c).h("ar<1,2>"))))}, +aj(a,b){return new A.ar(a.h("@<0>").q(b).h("ar<1,2>"))}, +b5(a){return new A.cA(a.h("cA<0>"))}, +hS(){var s=Object.create(null) +s[""]=s +delete s[""] +return s}, +iC(a){return new A.bh(a.h("bh<0>"))}, +iD(a){return new A.bh(a.h("bh<0>"))}, +hT(){var s=Object.create(null) +s[""]=s +delete s[""] +return s}, +l2(a,b,c){var s=new A.bi(a,b,c.h("bi<0>")) +s.c=a.e +return s}, +kn(a,b,c){var s=A.km(b,c) +a.F(0,new A.eV(s,b,c)) +return s}, +dq(a,b){var s=J.aa(a) +if(s.l())return s.gm() +return null}, +hJ(a,b,c){var s=A.ku(b,c) +s.T(0,a) +return s}, +hK(a,b){var s,r,q=A.iC(b) +for(s=a.length,r=0;r=$.a0.length)return A.n($.a0,-1) +$.a0.pop()}r=s.a +return r.charCodeAt(0)==0?r:r}, +cx:function cx(a){var _=this +_.a=0 +_.e=_.d=_.c=_.b=null +_.$ti=a}, +cy:function cy(a,b){this.a=a +this.$ti=b}, +cz:function cz(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +cA:function cA(a){var _=this +_.a=0 +_.e=_.d=_.c=_.b=null +_.$ti=a}, +aC:function aC(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +bh:function bh(a){var _=this +_.a=0 +_.f=_.e=_.d=_.c=_.b=null +_.r=0 +_.$ti=a}, +eb:function eb(a){this.a=a +this.c=this.b=null}, +bi:function bi(a,b,c){var _=this +_.a=a +_.b=b +_.d=_.c=null +_.$ti=c}, +aQ:function aQ(a,b){this.a=a +this.$ti=b}, +eV:function eV(a,b,c){this.a=a +this.b=b +this.c=c}, +p:function p(){}, +v:function v(){}, +f1:function f1(a){this.a=a}, +f2:function f2(a,b){this.a=a +this.b=b}, +bc:function bc(){}, +bM:function bM(){}, +lR(a,b){var s,r,q,p=null +try{p=JSON.parse(a)}catch(r){s=A.a1(r) +q=A.iw(String(s),null) +throw A.c(q)}q=A.h9(p) +return q}, +h9(a){var s +if(a==null)return null +if(typeof a!="object")return a +if(!Array.isArray(a))return new A.e9(a,Object.create(null)) +for(s=0;s")) +for(s=a.length,r=0;r")) +s=A.f([],b.h("z<0>")) +for(r=J.aa(a);r.l();)B.a.t(s,r.gm()) +return s}, +iI(a){return new A.dt(a,A.iA(a,!1,!0,!1,!1,!1))}, +iM(a,b,c){var s=J.aa(b) +if(!s.l())return a +if(c.length===0){do a+=A.l(s.gm()) +while(s.l())}else{a+=A.l(s.gm()) +for(;s.l();)a=a+c+A.l(s.gm())}return a}, +iL(){return A.ae(new Error())}, +kg(a){var s=Math.abs(a),r=a<0?"-":"" +if(s>=1000)return""+a +if(s>=100)return r+"0"+s +if(s>=10)return r+"00"+s +return r+"000"+s}, +it(a){if(a>=100)return""+a +if(a>=10)return"0"+a +return"00"+a}, +dg(a){if(a>=10)return""+a +return"0"+a}, +dj(a){if(typeof a=="number"||A.hZ(a)||a==null)return J.am(a) +if(typeof a=="string")return JSON.stringify(a) +return A.kK(a)}, +kk(a,b){A.he(a,"error",t.K) +A.he(b,"stackTrace",t.l) +A.kj(a,b)}, +d4(a){return new A.bU(a)}, +ey(a,b){return new A.a3(!1,null,b,a)}, +im(a,b,c){return new A.a3(!0,a,b,c)}, +kM(a,b){return new A.cc(null,null,!0,a,b,"Value not in range")}, +bA(a,b,c,d,e){return new A.cc(b,c,!0,a,d,"Invalid value")}, +kN(a,b,c){if(0>a||a>c)throw A.c(A.bA(a,0,c,"start",null)) +if(b!=null){if(a>b||b>c)throw A.c(A.bA(b,a,c,"end",null)) +return b}return c}, +hM(a,b){if(a<0)throw A.c(A.bA(a,0,null,b,null)) +return a}, +bp(a,b,c,d){return new A.dp(b,!0,a,d,"Index out of range")}, +az(a){return new A.cp(a)}, +iO(a){return new A.dP(a)}, +dF(a){return new A.ck(a)}, +R(a){return new A.de(a)}, +iw(a,b){return new A.eU(a,b)}, +ko(a,b,c){var s,r +if(A.i8(a)){if(b==="("&&c===")")return"(...)" +return b+"..."+c}s=A.f([],t.s) +B.a.t($.a0,a) +try{A.lP(a,s)}finally{if(0>=$.a0.length)return A.n($.a0,-1) +$.a0.pop()}r=A.iM(b,t.hf.a(s),", ")+c +return r.charCodeAt(0)==0?r:r}, +hG(a,b,c){var s,r +if(A.i8(a))return b+"..."+c +s=new A.dI(b) +B.a.t($.a0,a) +try{r=s +r.a=A.iM(r.a,a,", ")}finally{if(0>=$.a0.length)return A.n($.a0,-1) +$.a0.pop()}s.a+=c +r=s.a +return r.charCodeAt(0)==0?r:r}, +lP(a,b){var s,r,q,p,o,n,m,l=a.gv(a),k=0,j=0 +while(!0){if(!(k<80||j<3))break +if(!l.l())return +s=A.l(l.gm()) +B.a.t(b,s) +k+=s.length+2;++j}if(!l.l()){if(j<=5)return +if(0>=b.length)return A.n(b,-1) +r=b.pop() +if(0>=b.length)return A.n(b,-1) +q=b.pop()}else{p=l.gm();++j +if(!l.l()){if(j<=4){B.a.t(b,A.l(p)) +return}r=A.l(p) +if(0>=b.length)return A.n(b,-1) +q=b.pop() +k+=r.length+2}else{o=l.gm();++j +for(;l.l();p=o,o=n){n=l.gm();++j +if(j>100){while(!0){if(!(k>75&&j>3))break +if(0>=b.length)return A.n(b,-1) +k-=b.pop().length+2;--j}B.a.t(b,"...") +return}}q=A.l(p) +r=A.l(o) +k+=r.length+q.length+4}}if(j>b.length+2){k+=5 +m="..."}else m=null +while(!0){if(!(k>80&&b.length>3))break +if(0>=b.length)return A.n(b,-1) +k-=b.pop().length+2 +if(m==null){k+=5 +m="..."}}if(m!=null)B.a.t(b,m) +B.a.t(b,q) +B.a.t(b,r)}, +ky(a,b,c,d){var s +if(B.i===c){s=B.c.gu(a) +b=J.a2(b) +return A.ft(A.av(A.av($.ex(),s),b))}if(B.i===d){s=B.c.gu(a) +b=J.a2(b) +c=J.a2(c) +return A.ft(A.av(A.av(A.av($.ex(),s),b),c))}s=B.c.gu(a) +b=J.a2(b) +c=J.a2(c) +d=J.a2(d) +d=A.ft(A.av(A.av(A.av(A.av($.ex(),s),b),c),d)) +return d}, +kz(a){var s,r,q=$.ex() +for(s=a.length,r=0;r")) +s.bX() +return s}, +lu(a){var s,r="postMessage" in a +r.toString +if(r){s=A.l_(a) +return s}else return t.ch.a(a)}, +l_(a){var s=window +s.toString +if(a===s)return t.ci.a(a) +else return new A.e3()}, +jn(a,b){var s=$.r +if(s===B.b)return a +return s.dk(a,b)}, +d:function d(){}, +d1:function d1(){}, +d3:function d3(){}, +bm:function bm(){}, +d5:function d5(){}, +aX:function aX(){}, +aZ:function aZ(){}, +bo:function bo(){}, +b1:function b1(){}, +eC:function eC(){}, +di:function di(){}, +cw:function cw(a,b){this.a=a +this.$ti=b}, +a:function a(){}, +b:function b(){}, +eP:function eP(){}, +eI:function eI(a){this.a=a}, +q:function q(){}, +W:function W(){}, +dm:function dm(){}, +dn:function dn(){}, +c1:function c1(){}, +bq:function bq(){}, +as:function as(){}, +f0:function f0(){}, +bI:function bI(a){this.a=a}, +i:function i(){}, +bx:function bx(){}, +S:function S(){}, +bb:function bb(){}, +fk:function fk(){}, +bC:function bC(){}, +aP:function aP(){}, +bD:function bD(){}, +T:function T(){}, +cr:function cr(){}, +bH:function bH(){}, +cE:function cE(){}, +dY:function dY(){}, +bf:function bf(a){this.a=a}, +hE:function hE(a,b){this.a=a +this.$ti=b}, +bg:function bg(a,b,c,d){var _=this +_.a=a +_.b=b +_.c=c +_.$ti=d}, +bJ:function bJ(a,b,c,d){var _=this +_.a=a +_.b=b +_.c=c +_.$ti=d}, +cv:function cv(a,b,c,d,e){var _=this +_.b=a +_.c=b +_.d=c +_.e=d +_.$ti=e}, +fG:function fG(a){this.a=a}, +fH:function fH(a){this.a=a}, +fV:function fV(a){this.a=a}, +Y:function Y(){}, +fa:function fa(a){this.a=a}, +fc:function fc(a){this.a=a}, +fb:function fb(a,b,c){this.a=a +this.b=b +this.c=c}, +b3:function b3(a,b,c){var _=this +_.a=a +_.b=b +_.c=-1 +_.d=null +_.$ti=c}, +e3:function e3(){}, +ep:function ep(a){this.a=a +this.b=0}, +h1:function h1(a){this.a=a}, +e5:function e5(){}, +e6:function e6(){}, +ed:function ed(){}, +ee:function ee(){}, +es:function es(){}, +et:function et(){}, +dR:function dR(){}, +mp(a,b){var s=new A.u($.r,b.h("u<0>")),r=new A.cs(s,b.h("cs<0>")) +a.then(A.aU(new A.hr(r,b),1),A.aU(new A.hs(r),1)) +return s}, +hr:function hr(a,b){this.a=a +this.b=b}, +hs:function hs(a){this.a=a}, +fd:function fd(a){this.a=a}, +d7:function d7(a,b,c){var _=this +_.e=_.d=$ +_.c$=a +_.a$=b +_.b$=c}, +e_:function e_(){}, +kP(a,b){var s,r,q=new A.dD(a,A.f([],t.e)) +q.a=a +s=b==null?new A.bI(a):b +r=t.A +q.scj(A.aM(s,!0,r)) +r=A.dq(q.b,r) +s=r==null?null:r.previousSibling +q.f!==$&&A.hu() +q.f=s +return q}, +kl(a,b,c){var s=new A.b2(b,c) +s.cH(a,b,c) +return s}, +ez(a,b,c){if(a.getAttribute(b)==c)return +if(c==null)a.removeAttribute(b) +else a.setAttribute(b,c)}, +ai:function ai(a){var _=this +_.a=null +_.b=a +_.d=_.c=null}, +eD:function eD(){}, +eE:function eE(){}, +eF:function eF(){}, +eG:function eG(a,b,c){this.a=a +this.b=b +this.c=c}, +eH:function eH(a){this.a=a}, +dD:function dD(a,b){var _=this +_.e=a +_.f=$ +_.a=null +_.b=b +_.d=_.c=null}, +b2:function b2(a,b){this.a=a +this.b=b +this.c=null}, +eO:function eO(a){this.a=a}, +jt(a){var s=null +return new A.G("h2",s,s,s,s,s,s,a,s)}, +ak(a,b,c,d,e){return new A.G("div",d,b,e,null,c,null,a,null)}, +ia(a){var s=null +return new A.G("p",s,s,s,s,s,s,a,s)}, +jq(a,b,c){var s,r=null,q=t.N,p=A.hJ(A.aj(q,q),q,q) +q=A.aj(q,t.Q) +s=t.z +q.T(0,A.m8().$2$1$onClick(c,s,s)) +return new A.G("button",r,b,r,p,q,r,a,r)}, +i6(a,b,c,d,e){var s=null,r=t.N +r=A.hJ(A.aj(r,r),r,r) +if(a!=null)r.p(0,"alt",a) +if(d!=null)r.p(0,"height",A.l(d)) +r.p(0,"src",e) +return new A.G("img",s,b,s,r,c,s,s,s)}, +hd(a,b,c,d){var s=null,r=t.N +r=A.hJ(A.aj(r,r),r,r) +r.p(0,"href",d) +return new A.G("a",s,b,s,r,c,s,a,s)}, +ib(a,b,c){var s=null +return new A.G("span",s,b,s,s,c,s,a,s)}, +ic(a){var s=null +return new A.G("strong",s,s,s,s,s,s,a,s)}, +t:function t(a){this.b=a}, +iH(a){var s +$label0$0:{if(t.x.b(a)){s=new A.bG("text",t.gj) +break $label0$0}if(t.h.b(a)){s=a.tagName +s.toString +s=new A.bG("element:"+s,t.gj) +break $label0$0}s=null +break $label0$0}return new A.cd(a,s)}, +ba:function ba(a,b){this.c=a +this.a=b}, +cd:function cd(a,b){this.b=a +this.a=b}, +dC:function dC(a,b,c,d,e,f){var _=this +_.d$=a +_.e$=b +_.dx=null +_.dy=c +_.b=_.a=null +_.c=d +_.d=null +_.e=e +_.r=_.f=null +_.w=f +_.z=_.y=_.x=null +_.Q=!1 +_.as=!0 +_.at=!1 +_.cy=_.cx=_.CW=_.ch=_.ay=null +_.db=!1}, +d0:function d0(){}, +d2:function d2(){}, +dU:function dU(){}, +bR(a,b,c,d,e){var s +t.a.a(b) +d.h("~(0)?").a(c) +e.h("~(0)?").a(a) +s=A.aj(t.N,t.Q) +if(b!=null)s.p(0,"click",new A.hg(b)) +if(c!=null)s.p(0,"input",A.ja("onInput",c,d)) +if(a!=null)s.p(0,"change",A.ja("onChange",a,e)) +return s}, +ja(a,b,c){return new A.h7(b,c)}, +hg:function hg(a){this.a=a}, +h7:function h7(a,b){this.a=a +this.b=b}, +h5:function h5(a){this.a=a}, +h4:function h4(a){this.a=a}, +h6:function h6(){}, +cg:function cg(a){this.b=a}, +fi:function fi(){}, +fj:function fj(a,b){this.a=a +this.b=b}, +dS:function dS(a){this.a=a}, +d6:function d6(a,b){this.b=a +this.c=b}, +eA:function eA(a){this.b=a}, +eq:function eq(a){this.a=a}, +ec:function ec(){}, +iE(a){return B.h.e_(a)===a?B.c.i(B.h.cf(a)):B.h.i(a)}, +en:function en(){}, +aD:function aD(a,b){this.a=a +this.b=b}, +iR(a,b){return new A.dZ(b,a)}, +dZ:function dZ(a,b){this.w=a +this.z=b}, +dJ:function dJ(){}, +dK:function dK(){}, +ek:function ek(){}, +dL:function dL(){}, +mi(a){var s,r,q,p,o,n,m,l,k=a.c.ay +if(k==null)s=null +else{k=k.d$ +k.toString +s=k}if(s==null)return +for(k=s.b,r=k.length,q=t.fR,p=t.x,o=0;o=k.length)return A.n(k,1) +k=k[1] +k.toString +r=t.d1 +k=r.a(B.E.dC(0,A.ms(k,$.jS(),t.ey.a(t.gQ.a(new A.hm())),null),null)) +r=J.ig(t.j.a(k.k(0,"timelineEvents")),r) +q=A.j(r) +p=q.h("ac") +p=t.W.a(A.aM(new A.ac(r,q.h("ad(p.E)").a(A.mu()),p),!0,p.h("H.E"))) +a.f!==$&&A.hu() +a.scJ(p) +p=A.D(k.k(0,"testName")) +a.d!==$&&A.hu() +a.d=p +k=A.D(k.k(0,"testNameWithHierarchy")) +a.e!==$&&A.hu() +a.e=k +break}break}}, +hm:function hm(){}, +l9(a){var s=A.b5(t.I),r=($.M+1)%16777215 +$.M=r +return new A.cF(null,!1,s,r,a,B.e)}, +ki(a,b){var s,r=t.I +r.a(a) +r.a(b) +r=a.d +r.toString +s=b.d +s.toString +if(r").q(b).h("ao<1,2>"))}, +t(a,b){A.K(a).c.a(b) +a.$flags&1&&A.d_(a,29) +a.push(b)}, +G(a,b){var s +a.$flags&1&&A.d_(a,"remove",1) +for(s=0;s").a(b) +a.$flags&1&&A.d_(a,"addAll",2) +if(Array.isArray(b)){this.cK(a,b) +return}for(s=J.aa(b);s.l();)a.push(s.gm())}, +cK(a,b){var s,r +t.b.a(b) +s=b.length +if(s===0)return +if(a===b)throw A.c(A.R(a)) +for(r=0;r").q(c).h("ac<1,2>"))}, +aj(a,b){var s,r=A.dx(a.length,"",!1,t.N) +for(s=0;s=0&&b0)return a[0] +throw A.c(A.ix())}, +c3(a,b){var s,r +A.K(a).h("O(1)").a(b) +s=a.length +for(r=0;r0){a[0]=q +a[1]=r}return}p=0 +if(n.c.b(null))for(o=0;o0)this.d3(a,p)}, +d3(a,b){var s,r=a.length +for(;s=r-1,r>0;r=s)if(a[s]===null){a[s]=void 0;--b +if(b===0)break}}, +dK(a,b){var s,r=a.length +if(0>=r)return-1 +for(s=0;s"))}, +gu(a){return A.dB(a)}, +gj(a){return a.length}, +k(a,b){if(!(b>=0&&b=0&&b=p){r.sbO(null) +return!1}r.sbO(q[s]);++r.c +return!0}, +sbO(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +J.br.prototype={ +U(a,b){var s +A.lo(b) +if(ab)return 1 +else if(a===b){if(a===0){s=this.gbk(b) +if(this.gbk(a)===s)return 0 +if(this.gbk(a))return-1 +return 1}return 0}else if(isNaN(a)){if(isNaN(b))return 0 +return 1}else return-1}, +gbk(a){return a===0?1/a<0:a<0}, +cf(a){if(a>0){if(a!==1/0)return Math.round(a)}else if(a>-1/0)return 0-Math.round(0-a) +throw A.c(A.az(""+a+".round()"))}, +e_(a){if(a<0)return-Math.round(-a) +else return Math.round(a)}, +e6(a,b){var s,r,q,p,o +if(b<2||b>36)throw A.c(A.bA(b,2,36,"radix",null)) +s=a.toString(b) +r=s.length +q=r-1 +if(!(q>=0))return A.n(s,q) +if(s.charCodeAt(q)!==41)return s +p=/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(s) +if(p==null)A.bl(A.az("Unexpected toString result: "+s)) +r=p.length +if(1>=r)return A.n(p,1) +s=p[1] +if(3>=r)return A.n(p,3) +o=+p[3] +r=p[2] +if(r!=null){s+=r +o-=r.length}return s+B.d.bu("0",o)}, +i(a){if(a===0&&1/a<0)return"-0.0" +else return""+a}, +gu(a){var s,r,q,p,o=a|0 +if(a===o)return o&536870911 +s=Math.abs(a) +r=Math.log(s)/0.6931471805599453|0 +q=Math.pow(2,r) +p=s<1?s/q:q/s +return((p*9007199254740992|0)+(p*3542243181176521|0))*599197+r*1259&536870911}, +bt(a,b){var s=a%b +if(s===0)return 0 +if(s>0)return s +return s+b}, +bV(a,b){return(a|0)===a?a/b|0:this.df(a,b)}, +df(a,b){var s=a/b +if(s>=-2147483648&&s<=2147483647)return s|0 +if(s>0){if(s!==1/0)return Math.floor(s)}else if(s>-1/0)return Math.ceil(s) +throw A.c(A.az("Result of truncating division is "+A.l(s)+": "+A.l(a)+" ~/ "+b))}, +dc(a,b){var s +if(a>0)s=this.da(a,b) +else{s=b>31?31:b +s=a>>s>>>0}return s}, +da(a,b){return b>31?0:a>>>b}, +gO(a){return A.a8(t.di)}, +$ia4:1, +$iew:1, +$iag:1} +J.c3.prototype={ +gO(a){return A.a8(t.S)}, +$iaw:1, +$iaf:1} +J.ds.prototype={ +gO(a){return A.a8(t.gR)}, +$iaw:1} +J.aK.prototype={ +aS(a,b,c){return a.substring(b,A.kN(b,c,a.length))}, +cu(a,b){return this.aS(a,b,null)}, +e5(a){return a.toLowerCase()}, +e7(a){var s,r,q,p=a.trim(),o=p.length +if(o===0)return p +if(0>=o)return A.n(p,0) +if(p.charCodeAt(0)===133){s=J.ks(p,1) +if(s===o)return""}else s=0 +r=o-1 +if(!(r>=0))return A.n(p,r) +q=p.charCodeAt(r)===133?J.kt(p,r):o +if(s===0&&q===o)return p +return p.substring(s,q)}, +bu(a,b){var s,r +if(0>=b)return"" +if(b===1||a.length===0)return a +if(b!==b>>>0)throw A.c(B.F) +for(s=a,r="";!0;){if((b&1)===1)r=s+r +b=b>>>1 +if(b===0)break +s+=s}return r}, +cc(a,b,c){var s=b-a.length +if(s<=0)return a +return this.bu(c,s)+a}, +c7(a,b,c){var s=a.length +if(c>s)throw A.c(A.bA(c,0,s,null,null)) +return A.mr(a,b,c)}, +U(a,b){var s +A.D(b) +if(a===b)s=0 +else s=a>6}r=r+((r&67108863)<<3)&536870911 +r^=r>>11 +return r+((r&16383)<<15)&536870911}, +gO(a){return A.a8(t.N)}, +gj(a){return a.length}, +$iaw:1, +$ia4:1, +$iff:1, +$ih:1} +A.aR.prototype={ +gv(a){return new A.bX(J.aa(this.ga0()),A.j(this).h("bX<1,2>"))}, +gj(a){return J.ah(this.ga0())}, +gA(a){return J.hx(this.ga0())}, +C(a,b){return A.j(this).y[1].a(J.bT(this.ga0(),b))}, +i(a){return J.am(this.ga0())}} +A.bX.prototype={ +l(){return this.a.l()}, +gm(){return this.$ti.y[1].a(this.a.gm())}, +$iy:1} +A.aY.prototype={ +ga0(){return this.a}} +A.cu.prototype={$im:1} +A.ct.prototype={ +k(a,b){return this.$ti.y[1].a(J.ie(this.a,b))}, +p(a,b,c){var s=this.$ti +J.jU(this.a,b,s.c.a(s.y[1].a(c)))}, +$im:1, +$ix:1} +A.ao.prototype={ +a1(a,b){return new A.ao(this.a,this.$ti.h("@<1>").q(b).h("ao<1,2>"))}, +ga0(){return this.a}} +A.aL.prototype={ +i(a){return"LateInitializationError: "+this.a}} +A.hq.prototype={ +$0(){var s=new A.u($.r,t.cd) +s.aY(null) +return s}, +$S:7} +A.fl.prototype={} +A.m.prototype={} +A.H.prototype={ +gv(a){var s=this +return new A.au(s,s.gj(s),A.j(s).h("au"))}, +gA(a){return this.gj(this)===0}, +aj(a,b){var s,r,q,p=this,o=p.gj(p) +if(b.length!==0){if(o===0)return"" +s=A.l(p.C(0,0)) +if(o!==p.gj(p))throw A.c(A.R(p)) +for(r=s,q=1;q").q(c).h("ac<1,2>"))}} +A.cn.prototype={ +gcR(){var s=J.ah(this.a) +return s}, +gdd(){var s=J.ah(this.a),r=this.b +if(r>s)return s +return r}, +gj(a){var s=J.ah(this.a),r=this.b +if(r>=s)return 0 +return s-r}, +C(a,b){var s=this,r=s.gdd()+b +if(b<0||r>=s.gcR())throw A.c(A.bp(b,s.gj(0),s,"index")) +return J.bT(s.a,r)}} +A.au.prototype={ +gm(){var s=this.d +return s==null?this.$ti.c.a(s):s}, +l(){var s,r=this,q=r.a,p=J.bS(q),o=p.gj(q) +if(r.b!==o)throw A.c(A.R(q)) +s=r.c +if(s>=o){r.sa8(null) +return!1}r.sa8(p.C(q,s));++r.c +return!0}, +sa8(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +A.b8.prototype={ +gv(a){return new A.c8(J.aa(this.a),this.b,A.j(this).h("c8<1,2>"))}, +gj(a){return J.ah(this.a)}, +gA(a){return J.hx(this.a)}, +C(a,b){return this.b.$1(J.bT(this.a,b))}} +A.c_.prototype={$im:1} +A.c8.prototype={ +l(){var s=this,r=s.b +if(r.l()){s.sa8(s.c.$1(r.gm())) +return!0}s.sa8(null) +return!1}, +gm(){var s=this.a +return s==null?this.$ti.y[1].a(s):s}, +sa8(a){this.a=this.$ti.h("2?").a(a)}, +$iy:1} +A.ac.prototype={ +gj(a){return J.ah(this.a)}, +C(a,b){return this.b.$1(J.bT(this.a,b))}} +A.aA.prototype={ +gv(a){return new A.cq(J.aa(this.a),this.b,this.$ti.h("cq<1>"))}} +A.cq.prototype={ +l(){var s,r +for(s=this.a,r=this.b;s.l();)if(A.i1(r.$1(s.gm())))return!0 +return!1}, +gm(){return this.a.gm()}, +$iy:1} +A.co.prototype={ +p(a,b,c){this.$ti.c.a(c) +throw A.c(A.az("Cannot modify an unmodifiable list"))}} +A.bF.prototype={} +A.cf.prototype={ +gj(a){return J.ah(this.a)}, +C(a,b){var s=this.a,r=J.bS(s) +return r.C(s,r.gj(s)-1-b)}} +A.cO.prototype={} +A.bY.prototype={ +gA(a){return this.gj(this)===0}, +gL(a){return this.gj(this)!==0}, +i(a){return A.hL(this)}, +gaK(a){return new A.U(this.dF(0),A.j(this).h("U>"))}, +dF(a){var s=this +return function(){var r=a +var q=0,p=1,o,n,m,l,k,j +return function $async$gaK(b,c,d){if(c===1){o=d +q=p}while(true)switch(q){case 0:n=s.gB(),n=n.gv(n),m=A.j(s),l=m.y[1],m=m.h("a5<1,2>") +case 2:if(!n.l()){q=3 +break}k=n.gm() +j=s.k(0,k) +q=4 +return b.b=new A.a5(k,j==null?l.a(j):j,m),1 +case 4:q=2 +break +case 3:return 0 +case 1:return b.c=o,3}}}}, +$iE:1} +A.bZ.prototype={ +gj(a){return this.b.length}, +gbR(){var s=this.$keys +if(s==null){s=Object.keys(this.a) +this.$keys=s}return s}, +W(a){if(typeof a!="string")return!1 +if("__proto__"===a)return!1 +return this.a.hasOwnProperty(a)}, +k(a,b){if(!this.W(b))return null +return this.b[this.a[b]]}, +F(a,b){var s,r,q,p +this.$ti.h("~(1,2)").a(b) +s=this.gbR() +r=this.b +for(q=s.length,p=0;p"))}} +A.cB.prototype={ +gj(a){return this.a.length}, +gA(a){return 0===this.a.length}, +gv(a){var s=this.a +return new A.cC(s,s.length,this.$ti.h("cC<1>"))}} +A.cC.prototype={ +gm(){var s=this.d +return s==null?this.$ti.c.a(s):s}, +l(){var s=this,r=s.c +if(r>=s.b){s.sa9(null) +return!1}s.sa9(s.a[r]);++s.c +return!0}, +sa9(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +A.fw.prototype={ +N(a){var s,r,q=this,p=new RegExp(q.a).exec(a) +if(p==null)return null +s=Object.create(null) +r=q.b +if(r!==-1)s.arguments=p[r+1] +r=q.c +if(r!==-1)s.argumentsExpr=p[r+1] +r=q.d +if(r!==-1)s.expr=p[r+1] +r=q.e +if(r!==-1)s.method=p[r+1] +r=q.f +if(r!==-1)s.receiver=p[r+1] +return s}} +A.ca.prototype={ +i(a){return"Null check operator used on a null value"}} +A.du.prototype={ +i(a){var s,r=this,q="NoSuchMethodError: method not found: '",p=r.b +if(p==null)return"NoSuchMethodError: "+r.a +s=r.c +if(s==null)return q+p+"' ("+r.a+")" +return q+p+"' on '"+s+"' ("+r.a+")"}} +A.dQ.prototype={ +i(a){var s=this.a +return s.length===0?"Error":"Error: "+s}} +A.fe.prototype={ +i(a){return"Throw of null ('"+(this.a===null?"null":"undefined")+"' from JavaScript)"}} +A.c0.prototype={} +A.cG.prototype={ +i(a){var s,r=this.b +if(r!=null)return r +r=this.a +s=r!==null&&typeof r==="object"?r.stack:null +return this.b=s==null?"":s}, +$iaO:1} +A.aH.prototype={ +i(a){var s=this.constructor,r=s==null?null:s.name +return"Closure '"+A.jB(r==null?"unknown":r)+"'"}, +gO(a){var s=A.i3(this) +return A.a8(s==null?A.a9(this):s)}, +$ib4:1, +ge9(){return this}, +$C:"$1", +$R:1, +$D:null} +A.d9.prototype={$C:"$0",$R:0} +A.da.prototype={$C:"$2",$R:2} +A.dM.prototype={} +A.dH.prototype={ +i(a){var s=this.$static_name +if(s==null)return"Closure of unknown static method" +return"Closure '"+A.jB(s)+"'"}} +A.bn.prototype={ +P(a,b){if(b==null)return!1 +if(this===b)return!0 +if(!(b instanceof A.bn))return!1 +return this.$_target===b.$_target&&this.a===b.a}, +gu(a){return(A.jw(this.a)^A.dB(this.$_target))>>>0}, +i(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.fg(this.a)+"'")}} +A.e2.prototype={ +i(a){return"Reading static variable '"+this.a+"' during its initialization"}} +A.dE.prototype={ +i(a){return"RuntimeError: "+this.a}} +A.dV.prototype={ +i(a){return"Assertion failed: "+A.dj(this.a)}} +A.ar.prototype={ +gj(a){return this.a}, +gA(a){return this.a===0}, +gL(a){return this.a!==0}, +gB(){return new A.at(this,A.j(this).h("at<1>"))}, +W(a){var s,r +if(typeof a=="string"){s=this.b +if(s==null)return!1 +return s[a]!=null}else{r=this.dM(a) +return r}}, +dM(a){var s=this.d +if(s==null)return!1 +return this.aO(s[this.aN(a)],a)>=0}, +T(a,b){A.j(this).h("E<1,2>").a(b).F(0,new A.eX(this))}, +k(a,b){var s,r,q,p,o=null +if(typeof b=="string"){s=this.b +if(s==null)return o +r=s[b] +q=r==null?o:r.b +return q}else if(typeof b=="number"&&(b&0x3fffffff)===b){p=this.c +if(p==null)return o +r=p[b] +q=r==null?o:r.b +return q}else return this.dN(b)}, +dN(a){var s,r,q=this.d +if(q==null)return null +s=q[this.aN(a)] +r=this.aO(s,a) +if(r<0)return null +return s[r].b}, +p(a,b,c){var s,r,q=this,p=A.j(q) +p.c.a(b) +p.y[1].a(c) +if(typeof b=="string"){s=q.b +q.bG(s==null?q.b=q.b8():s,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){r=q.c +q.bG(r==null?q.c=q.b8():r,b,c)}else q.dP(b,c)}, +dP(a,b){var s,r,q,p,o=this,n=A.j(o) +n.c.a(a) +n.y[1].a(b) +s=o.d +if(s==null)s=o.d=o.b8() +r=o.aN(a) +q=s[r] +if(q==null)s[r]=[o.b9(a,b)] +else{p=o.aO(q,a) +if(p>=0)q[p].b=b +else q.push(o.b9(a,b))}}, +G(a,b){var s +if(typeof b=="string")return this.d1(this.b,b) +else{s=this.dO(b) +return s}}, +dO(a){var s,r,q,p,o=this,n=o.d +if(n==null)return null +s=o.aN(a) +r=n[s] +q=o.aO(r,a) +if(q<0)return null +p=r.splice(q,1)[0] +o.bY(p) +if(r.length===0)delete n[s] +return p.b}, +F(a,b){var s,r,q=this +A.j(q).h("~(1,2)").a(b) +s=q.e +r=q.r +for(;s!=null;){b.$2(s.a,s.b) +if(r!==q.r)throw A.c(A.R(q)) +s=s.c}}, +bG(a,b,c){var s,r=A.j(this) +r.c.a(b) +r.y[1].a(c) +s=a[b] +if(s==null)a[b]=this.b9(b,c) +else s.b=c}, +d1(a,b){var s +if(a==null)return null +s=a[b] +if(s==null)return null +this.bY(s) +delete a[b] +return s.b}, +bS(){this.r=this.r+1&1073741823}, +b9(a,b){var s=this,r=A.j(s),q=new A.f_(r.c.a(a),r.y[1].a(b)) +if(s.e==null)s.e=s.f=q +else{r=s.f +r.toString +q.d=r +s.f=r.c=q}++s.a +s.bS() +return q}, +bY(a){var s=this,r=a.d,q=a.c +if(r==null)s.e=q +else r.c=q +if(q==null)s.f=r +else q.d=r;--s.a +s.bS()}, +aN(a){return J.a2(a)&1073741823}, +aO(a,b){var s,r +if(a==null)return-1 +s=a.length +for(r=0;r"]=s +delete s[""] +return s}, +$iiB:1} +A.eX.prototype={ +$2(a,b){var s=this.a,r=A.j(s) +s.p(0,r.c.a(a),r.y[1].a(b))}, +$S(){return A.j(this.a).h("~(1,2)")}} +A.f_.prototype={} +A.at.prototype={ +gj(a){return this.a.a}, +gA(a){return this.a.a===0}, +gv(a){var s=this.a,r=new A.c7(s,s.r,this.$ti.h("c7<1>")) +r.c=s.e +return r}} +A.c7.prototype={ +gm(){return this.d}, +l(){var s,r=this,q=r.a +if(r.b!==q.r)throw A.c(A.R(q)) +s=r.c +if(s==null){r.sa9(null) +return!1}else{r.sa9(s.a) +r.c=s.c +return!0}}, +sa9(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +A.hj.prototype={ +$1(a){return this.a(a)}, +$S:30} +A.hk.prototype={ +$2(a,b){return this.a(a,b)}, +$S:16} +A.hl.prototype={ +$1(a){return this.a(A.D(a))}, +$S:17} +A.ef.prototype={} +A.dt.prototype={ +i(a){return"RegExp/"+this.a+"/"+this.b.flags}, +gcX(){var s=this,r=s.c +if(r!=null)return r +r=s.b +return s.c=A.iA(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,!0)}, +dH(a){var s=this.b.exec(a) +if(s==null)return null +return new A.cD(s)}, +cS(a,b){var s,r=this.gcX() +if(r==null)r=t.K.a(r) +r.lastIndex=b +s=r.exec(a) +if(s==null)return null +return new A.cD(s)}, +$iff:1, +$ikO:1} +A.cD.prototype={ +gdE(){var s=this.b +return s.index+s[0].length}, +bs(a){var s=this.b +if(!(a=0&&q=55296&&q<=56319){if(!(n>=0))return A.n(l,n) +s=l.charCodeAt(n) +s=s>=56320&&s<=57343}}}o=(s?o+1:o)+1}m.c=o +return!0}}m.b=m.d=null +return!1}, +$iy:1} +A.fD.prototype={ +M(){var s=this.b +if(s===this)throw A.c(new A.aL("Local '' has not been initialized.")) +return s}} +A.a6.prototype={ +h(a){return A.cM(v.typeUniverse,this,a)}, +q(a){return A.j7(v.typeUniverse,this,a)}} +A.e7.prototype={} +A.em.prototype={ +i(a){return A.L(this.a,null)}, +$ihP:1} +A.e4.prototype={ +i(a){return this.a}} +A.cI.prototype={$iax:1} +A.fA.prototype={ +$1(a){var s=this.a,r=s.a +s.a=null +r.$0()}, +$S:5} +A.fz.prototype={ +$1(a){var s,r +this.a.a=t.M.a(a) +s=this.b +r=this.c +s.firstChild?s.removeChild(r):s.appendChild(r)}, +$S:12} +A.fB.prototype={ +$0(){this.a.$0()}, +$S:6} +A.fC.prototype={ +$0(){this.a.$0()}, +$S:6} +A.el.prototype={ +cI(a,b){if(self.setTimeout!=null)this.b=self.setTimeout(A.aU(new A.h_(this,b),0),a) +else throw A.c(A.az("`setTimeout()` not found."))}, +aI(){if(self.setTimeout!=null){var s=this.b +if(s==null)return +self.clearTimeout(s) +this.b=null}else throw A.c(A.az("Canceling a timer."))}, +$ikU:1} +A.h_.prototype={ +$0(){this.a.b=null +this.b.$0()}, +$S:0} +A.dW.prototype={ +bd(a,b){var s,r=this,q=r.$ti +q.h("1/?").a(b) +if(b==null)b=q.c.a(b) +if(!r.b)r.a.aY(b) +else{s=r.a +if(q.h("X<1>").b(b))s.bH(b) +else s.b1(b)}}, +be(a,b){var s=this.a +if(this.b)s.Z(a,b) +else s.av(a,b)}} +A.h2.prototype={ +$1(a){return this.a.$2(0,a)}, +$S:3} +A.h3.prototype={ +$2(a,b){this.a.$2(1,new A.c0(a,t.l.a(b)))}, +$S:34} +A.hc.prototype={ +$2(a,b){this.a(A.cP(a),b)}, +$S:10} +A.cH.prototype={ +gm(){var s=this.b +return s==null?this.$ti.c.a(s):s}, +d4(a,b){var s,r,q +a=A.cP(a) +b=b +s=this.a +for(;!0;)try{r=s(this,a,b) +return r}catch(q){b=q +a=1}}, +l(){var s,r,q,p,o=this,n=null,m=null,l=0 +for(;!0;){s=o.d +if(s!=null)try{if(s.l()){o.saX(s.gm()) +return!0}else o.sb7(n)}catch(r){m=r +l=1 +o.sb7(n)}q=o.d4(l,m) +if(1===q)return!0 +if(0===q){o.saX(n) +p=o.e +if(p==null||p.length===0){o.a=A.j1 +return!1}if(0>=p.length)return A.n(p,-1) +o.a=p.pop() +l=0 +m=null +continue}if(2===q){l=0 +m=null +continue}if(3===q){m=o.c +o.c=null +p=o.e +if(p==null||p.length===0){o.saX(n) +o.a=A.j1 +throw m +return!1}if(0>=p.length)return A.n(p,-1) +o.a=p.pop() +l=1 +continue}throw A.c(A.dF("sync*"))}return!1}, +ec(a){var s,r,q=this +if(a instanceof A.U){s=a.a() +r=q.e +if(r==null)r=q.e=[] +B.a.t(r,q.a) +q.a=s +return 2}else{q.sb7(J.aa(a)) +return 2}}, +saX(a){this.b=this.$ti.h("1?").a(a)}, +sb7(a){this.d=this.$ti.h("y<1>?").a(a)}, +$iy:1} +A.U.prototype={ +gv(a){return new A.cH(this.a(),this.$ti.h("cH<1>"))}} +A.an.prototype={ +i(a){return A.l(this.a)}, +$iw:1, +ga7(){return this.b}} +A.e1.prototype={ +be(a,b){var s,r=this.a +if((r.a&30)!==0)throw A.c(A.dF("Future already completed")) +s=A.lD(a,b) +r.av(s.a,s.b)}, +c6(a){return this.be(a,null)}} +A.cs.prototype={ +bd(a,b){var s,r=this.$ti +r.h("1/?").a(b) +s=this.a +if((s.a&30)!==0)throw A.c(A.dF("Future already completed")) +s.aY(r.h("1/").a(b))}} +A.aB.prototype={ +dR(a){if((this.c&15)!==6)return!0 +return this.b.b.bn(t.al.a(this.d),a.a,t.y,t.K)}, +dJ(a){var s,r=this,q=r.e,p=null,o=t.z,n=t.K,m=a.a,l=r.b.b +if(t.R.b(q))p=l.e0(q,m,a.b,o,n,t.l) +else p=l.bn(t.v.a(q),m,o,n) +try{o=r.$ti.h("2/").a(p) +return o}catch(s){if(t.eK.b(A.a1(s))){if((r.c&1)!==0)throw A.c(A.ey("The error handler of Future.then must return a value of the returned future's type","onError")) +throw A.c(A.ey("The error handler of Future.catchError must return a value of the future's type","onError"))}else throw s}}} +A.u.prototype={ +bU(a){this.a=this.a&1|4 +this.c=a}, +bo(a,b,c){var s,r,q,p=this.$ti +p.q(c).h("1/(2)").a(a) +s=$.r +if(s===B.b){if(b!=null&&!t.R.b(b)&&!t.v.b(b))throw A.c(A.im(b,"onError",u.c))}else{c.h("@<0/>").q(p.c).h("1(2)").a(a) +if(b!=null)b=A.lT(b,s)}r=new A.u(s,c.h("u<0>")) +q=b==null?1:3 +this.au(new A.aB(r,q,a,b,p.h("@<1>").q(c).h("aB<1,2>"))) +return r}, +e4(a,b){return this.bo(a,null,b)}, +bW(a,b,c){var s,r=this.$ti +r.q(c).h("1/(2)").a(a) +s=new A.u($.r,c.h("u<0>")) +this.au(new A.aB(s,19,a,b,r.h("@<1>").q(c).h("aB<1,2>"))) +return s}, +d9(a){this.a=this.a&1|16 +this.c=a}, +aw(a){this.a=a.a&30|this.a&1 +this.c=a.c}, +au(a){var s,r=this,q=r.a +if(q<=3){a.a=t.F.a(r.c) +r.c=a}else{if((q&4)!==0){s=t.c.a(r.c) +if((s.a&24)===0){s.au(a) +return}r.aw(s)}A.bO(null,null,r.b,t.M.a(new A.fJ(r,a)))}}, +ba(a){var s,r,q,p,o,n,m=this,l={} +l.a=a +if(a==null)return +s=m.a +if(s<=3){r=t.F.a(m.c) +m.c=a +if(r!=null){q=a.a +for(p=a;q!=null;p=q,q=o)o=q.a +p.a=r}}else{if((s&4)!==0){n=t.c.a(m.c) +if((n.a&24)===0){n.ba(a) +return}m.aw(n)}l.a=m.aC(a) +A.bO(null,null,m.b,t.M.a(new A.fQ(l,m)))}}, +aB(){var s=t.F.a(this.c) +this.c=null +return this.aC(s)}, +aC(a){var s,r,q +for(s=a,r=null;s!=null;r=s,s=q){q=s.a +s.a=r}return r}, +cN(a){var s,r,q,p=this +p.a^=2 +try{a.bo(new A.fN(p),new A.fO(p),t.P)}catch(q){s=A.a1(q) +r=A.ae(q) +A.jA(new A.fP(p,s,r))}}, +b0(a){var s,r=this,q=r.$ti +q.h("1/").a(a) +s=r.aB() +q.c.a(a) +r.a=8 +r.c=a +A.bL(r,s)}, +b1(a){var s,r=this +r.$ti.c.a(a) +s=r.aB() +r.a=8 +r.c=a +A.bL(r,s)}, +Z(a,b){var s +t.l.a(b) +s=this.aB() +this.d9(new A.an(a,b)) +A.bL(this,s)}, +aY(a){var s=this.$ti +s.h("1/").a(a) +if(s.h("X<1>").b(a)){this.bH(a) +return}this.cM(a)}, +cM(a){var s=this +s.$ti.c.a(a) +s.a^=2 +A.bO(null,null,s.b,t.M.a(new A.fL(s,a)))}, +bH(a){var s=this.$ti +s.h("X<1>").a(a) +if(s.b(a)){A.l0(a,this) +return}this.cN(a)}, +av(a,b){this.a^=2 +A.bO(null,null,this.b,t.M.a(new A.fK(this,a,b)))}, +$iX:1} +A.fJ.prototype={ +$0(){A.bL(this.a,this.b)}, +$S:0} +A.fQ.prototype={ +$0(){A.bL(this.b,this.a.a)}, +$S:0} +A.fN.prototype={ +$1(a){var s,r,q,p=this.a +p.a^=2 +try{p.b1(p.$ti.c.a(a))}catch(q){s=A.a1(q) +r=A.ae(q) +p.Z(s,r)}}, +$S:5} +A.fO.prototype={ +$2(a,b){this.a.Z(t.K.a(a),t.l.a(b))}, +$S:11} +A.fP.prototype={ +$0(){this.a.Z(this.b,this.c)}, +$S:0} +A.fM.prototype={ +$0(){A.iU(this.a.a,this.b)}, +$S:0} +A.fL.prototype={ +$0(){this.a.b1(this.b)}, +$S:0} +A.fK.prototype={ +$0(){this.a.Z(this.b,this.c)}, +$S:0} +A.fT.prototype={ +$0(){var s,r,q,p,o,n,m,l=this,k=null +try{q=l.a.a +k=q.b.b.cg(t.O.a(q.d),t.z)}catch(p){s=A.a1(p) +r=A.ae(p) +if(l.c&&t.n.a(l.b.a.c).a===s){q=l.a +q.c=t.n.a(l.b.a.c)}else{q=s +o=r +if(o==null)o=A.hA(q) +n=l.a +n.c=new A.an(q,o) +q=n}q.b=!0 +return}if(k instanceof A.u&&(k.a&24)!==0){if((k.a&16)!==0){q=l.a +q.c=t.n.a(k.c) +q.b=!0}return}if(k instanceof A.u){m=l.b.a +q=l.a +q.c=k.e4(new A.fU(m),t.z) +q.b=!1}}, +$S:0} +A.fU.prototype={ +$1(a){return this.a}, +$S:9} +A.fS.prototype={ +$0(){var s,r,q,p,o,n,m,l +try{q=this.a +p=q.a +o=p.$ti +n=o.c +m=n.a(this.b) +q.c=p.b.b.bn(o.h("2/(1)").a(p.d),m,o.h("2/"),n)}catch(l){s=A.a1(l) +r=A.ae(l) +q=s +p=r +if(p==null)p=A.hA(q) +o=this.a +o.c=new A.an(q,p) +o.b=!0}}, +$S:0} +A.fR.prototype={ +$0(){var s,r,q,p,o,n,m,l=this +try{s=t.n.a(l.a.a.c) +p=l.b +if(p.a.dR(s)&&p.a.e!=null){p.c=p.a.dJ(s) +p.b=!1}}catch(o){r=A.a1(o) +q=A.ae(o) +p=t.n.a(l.a.a.c) +if(p.a===r){n=l.b +n.c=p +p=n}else{p=r +n=q +if(n==null)n=A.hA(p) +m=l.b +m.c=new A.an(p,n) +p=m}p.b=!0}}, +$S:0} +A.dX.prototype={} +A.cm.prototype={ +gj(a){var s,r,q=this,p={},o=new A.u($.r,t.fJ) +p.a=0 +s=A.j(q) +r=s.h("~(1)?").a(new A.fr(p,q)) +t.a.a(new A.fs(p,o)) +A.fF(q.a,q.b,r,!1,s.c) +return o}, +gbi(a){var s,r=this,q=A.j(r),p=new A.u($.r,q.h("u<1>")) +t.a.a(new A.fp(p)) +s=A.fF(r.a,r.b,null,!1,q.c) +s.dT(new A.fq(r,s,p)) +return p}} +A.fr.prototype={ +$1(a){A.j(this.b).c.a(a);++this.a.a}, +$S(){return A.j(this.b).h("~(1)")}} +A.fs.prototype={ +$0(){this.b.b0(this.a.a)}, +$S:0} +A.fp.prototype={ +$0(){var s,r,q,p,o +try{q=A.ix() +throw A.c(q)}catch(p){s=A.a1(p) +r=A.ae(p) +q=s +o=r +A.je(q,o) +this.a.Z(q,o)}}, +$S:0} +A.fq.prototype={ +$1(a){A.lt(this.b,this.c,A.j(this.a).c.a(a))}, +$S(){return A.j(this.a).h("~(1)")}} +A.ei.prototype={} +A.h8.prototype={ +$0(){return this.a.b0(this.b)}, +$S:0} +A.cN.prototype={$iiQ:1} +A.hb.prototype={ +$0(){A.kk(this.a,this.b)}, +$S:0} +A.eh.prototype={ +e1(a){var s,r,q +t.M.a(a) +try{if(B.b===$.r){a.$0() +return}A.ji(null,null,this,a,t.H)}catch(q){s=A.a1(q) +r=A.ae(q) +A.ha(t.K.a(s),t.l.a(r))}}, +e2(a,b,c){var s,r,q +c.h("~(0)").a(a) +c.a(b) +try{if(B.b===$.r){a.$1(b) +return}A.jj(null,null,this,a,b,t.H,c)}catch(q){s=A.a1(q) +r=A.ae(q) +A.ha(t.K.a(s),t.l.a(r))}}, +bc(a){return new A.fY(this,t.M.a(a))}, +dk(a,b){return new A.fZ(this,b.h("~(0)").a(a),b)}, +cg(a,b){b.h("0()").a(a) +if($.r===B.b)return a.$0() +return A.ji(null,null,this,a,b)}, +bn(a,b,c,d){c.h("@<0>").q(d).h("1(2)").a(a) +d.a(b) +if($.r===B.b)return a.$1(b) +return A.jj(null,null,this,a,b,c,d)}, +e0(a,b,c,d,e,f){d.h("@<0>").q(e).q(f).h("1(2,3)").a(a) +e.a(b) +f.a(c) +if($.r===B.b)return a.$2(b,c) +return A.lU(null,null,this,a,b,c,d,e,f)}, +ce(a,b,c,d){return b.h("@<0>").q(c).q(d).h("1(2,3)").a(a)}} +A.fY.prototype={ +$0(){return this.a.e1(this.b)}, +$S:0} +A.fZ.prototype={ +$1(a){var s=this.c +return this.a.e2(this.b,s.a(a),s)}, +$S(){return this.c.h("~(0)")}} +A.cx.prototype={ +gj(a){return this.a}, +gA(a){return this.a===0}, +gL(a){return this.a!==0}, +gB(){return new A.cy(this,A.j(this).h("cy<1>"))}, +W(a){var s=this.cP(a) +return s}, +cP(a){var s=this.d +if(s==null)return!1 +return this.H(this.bP(s,a),a)>=0}, +k(a,b){var s,r,q +if(typeof b=="string"&&b!=="__proto__"){s=this.b +r=s==null?null:A.iV(s,b) +return r}else if(typeof b=="number"&&(b&1073741823)===b){q=this.c +r=q==null?null:A.iV(q,b) +return r}else return this.cU(b)}, +cU(a){var s,r,q=this.d +if(q==null)return null +s=this.bP(q,a) +r=this.H(s,a) +return r<0?null:s[r+1]}, +p(a,b,c){var s,r,q=this,p=A.j(q) +p.c.a(b) +p.y[1].a(c) +if(typeof b=="string"&&b!=="__proto__"){s=q.b +q.bI(s==null?q.b=A.hQ():s,b,c)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c +q.bI(r==null?q.c=A.hQ():r,b,c)}else q.d8(b,c)}, +d8(a,b){var s,r,q,p,o=this,n=A.j(o) +n.c.a(a) +n.y[1].a(b) +s=o.d +if(s==null)s=o.d=A.hQ() +r=o.J(a) +q=s[r] +if(q==null){A.hR(s,r,[a,b]);++o.a +o.e=null}else{p=o.H(q,a) +if(p>=0)q[p+1]=b +else{q.push(a,b);++o.a +o.e=null}}}, +G(a,b){var s=this.ad(b) +return s}, +ad(a){var s,r,q,p,o=this,n=o.d +if(n==null)return null +s=o.J(a) +r=n[s] +q=o.H(r,a) +if(q<0)return null;--o.a +o.e=null +p=r.splice(q,2)[1] +if(0===r.length)delete n[s] +return p}, +F(a,b){var s,r,q,p,o,n,m=this,l=A.j(m) +l.h("~(1,2)").a(b) +s=m.bJ() +for(r=s.length,q=l.c,l=l.y[1],p=0;p"))}} +A.cz.prototype={ +gm(){var s=this.d +return s==null?this.$ti.c.a(s):s}, +l(){var s=this,r=s.b,q=s.c,p=s.a +if(r!==p.e)throw A.c(A.R(p)) +else if(q>=r.length){s.sS(null) +return!1}else{s.sS(r[q]) +s.c=q+1 +return!0}}, +sS(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +A.cA.prototype={ +gv(a){return new A.aC(this,this.b2(),A.j(this).h("aC<1>"))}, +gj(a){return this.a}, +gA(a){return this.a===0}, +V(a,b){var s,r +if(typeof b=="string"&&b!=="__proto__"){s=this.b +return s==null?!1:s[b]!=null}else if(typeof b=="number"&&(b&1073741823)===b){r=this.c +return r==null?!1:r[b]!=null}else return this.b3(b)}, +b3(a){var s=this.d +if(s==null)return!1 +return this.H(s[this.J(a)],a)>=0}, +t(a,b){var s,r,q=this +A.j(q).c.a(b) +if(typeof b=="string"&&b!=="__proto__"){s=q.b +return q.aa(s==null?q.b=A.hS():s,b)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c +return q.aa(r==null?q.c=A.hS():r,b)}else return q.aW(b)}, +aW(a){var s,r,q,p=this +A.j(p).c.a(a) +s=p.d +if(s==null)s=p.d=A.hS() +r=p.J(a) +q=s[r] +if(q==null)s[r]=[a] +else{if(p.H(q,a)>=0)return!1 +q.push(a)}++p.a +p.e=null +return!0}, +G(a,b){var s=this +if(typeof b=="string"&&b!=="__proto__")return s.ab(s.b,b) +else if(typeof b=="number"&&(b&1073741823)===b)return s.ab(s.c,b) +else return s.ad(b)}, +ad(a){var s,r,q,p=this,o=p.d +if(o==null)return!1 +s=p.J(a) +r=o[s] +q=p.H(r,a) +if(q<0)return!1;--p.a +p.e=null +r.splice(q,1) +if(0===r.length)delete o[s] +return!0}, +K(a){var s=this +if(s.a>0){s.b=s.c=s.d=s.e=null +s.a=0}}, +b2(){var s,r,q,p,o,n,m,l,k,j,i=this,h=i.e +if(h!=null)return h +h=A.dx(i.a,null,!1,t.z) +s=i.b +r=0 +if(s!=null){q=Object.getOwnPropertyNames(s) +p=q.length +for(o=0;o=r.length){s.sS(null) +return!1}else{s.sS(r[q]) +s.c=q+1 +return!0}}, +sS(a){this.d=this.$ti.h("1?").a(a)}, +$iy:1} +A.bh.prototype={ +gv(a){var s=this,r=new A.bi(s,s.r,A.j(s).h("bi<1>")) +r.c=s.e +return r}, +gj(a){return this.a}, +gA(a){return this.a===0}, +V(a,b){var s,r +if(b!=="__proto__"){s=this.b +if(s==null)return!1 +return t.g.a(s[b])!=null}else{r=this.b3(b) +return r}}, +b3(a){var s=this.d +if(s==null)return!1 +return this.H(s[this.J(a)],a)>=0}, +F(a,b){var s,r,q=this,p=A.j(q) +p.h("~(1)").a(b) +s=q.e +r=q.r +for(p=p.c;s!=null;){b.$1(p.a(s.a)) +if(r!==q.r)throw A.c(A.R(q)) +s=s.b}}, +t(a,b){var s,r,q=this +A.j(q).c.a(b) +if(typeof b=="string"&&b!=="__proto__"){s=q.b +return q.aa(s==null?q.b=A.hT():s,b)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c +return q.aa(r==null?q.c=A.hT():r,b)}else return q.aW(b)}, +aW(a){var s,r,q,p=this +A.j(p).c.a(a) +s=p.d +if(s==null)s=p.d=A.hT() +r=p.J(a) +q=s[r] +if(q==null)s[r]=[p.b_(a)] +else{if(p.H(q,a)>=0)return!1 +q.push(p.b_(a))}return!0}, +G(a,b){var s=this +if(typeof b=="string"&&b!=="__proto__")return s.ab(s.b,b) +else if(typeof b=="number"&&(b&1073741823)===b)return s.ab(s.c,b) +else return s.ad(b)}, +ad(a){var s,r,q,p,o=this,n=o.d +if(n==null)return!1 +s=o.J(a) +r=n[s] +q=o.H(r,a) +if(q<0)return!1 +p=r.splice(q,1)[0] +if(0===r.length)delete n[s] +o.bL(p) +return!0}, +aa(a,b){A.j(this).c.a(b) +if(t.g.a(a[b])!=null)return!1 +a[b]=this.b_(b) +return!0}, +ab(a,b){var s +if(a==null)return!1 +s=t.g.a(a[b]) +if(s==null)return!1 +this.bL(s) +delete a[b] +return!0}, +bK(){this.r=this.r+1&1073741823}, +b_(a){var s,r=this,q=new A.eb(A.j(r).c.a(a)) +if(r.e==null)r.e=r.f=q +else{s=r.f +s.toString +q.c=s +r.f=s.b=q}++r.a +r.bK() +return q}, +bL(a){var s=this,r=a.c,q=a.b +if(r==null)s.e=q +else r.b=q +if(q==null)s.f=r +else q.c=r;--s.a +s.bK()}, +J(a){return J.a2(a)&1073741823}, +H(a,b){var s,r +if(a==null)return-1 +s=a.length +for(r=0;r"))}, +gj(a){return J.ah(this.a)}, +k(a,b){return J.bT(this.a,b)}} +A.eV.prototype={ +$2(a,b){this.a.p(0,this.b.a(a),this.c.a(b))}, +$S:13} +A.p.prototype={ +gv(a){return new A.au(a,this.gj(a),A.a9(a).h("au"))}, +C(a,b){return this.k(a,b)}, +gA(a){return this.gj(a)===0}, +al(a,b,c){var s=A.a9(a) +return new A.ac(a,s.q(c).h("1(p.E)").a(b),s.h("@").q(c).h("ac<1,2>"))}, +aP(a){var s,r,q,p,o=this +if(o.gA(a)){s=J.iy(0,A.a9(a).h("p.E")) +return s}r=o.k(a,0) +q=A.dx(o.gj(a),r,!0,A.a9(a).h("p.E")) +for(p=1;p").q(b).h("ao<1,2>"))}, +i(a){return A.hG(a,"[","]")}, +$im:1, +$ie:1, +$ix:1} +A.v.prototype={ +F(a,b){var s,r,q,p=A.j(this) +p.h("~(v.K,v.V)").a(b) +for(s=J.aa(this.gB()),p=p.h("v.V");s.l();){r=s.gm() +q=this.k(0,r) +b.$2(r,q==null?p.a(q):q)}}, +gaK(a){return J.ik(this.gB(),new A.f1(this),A.j(this).h("a5"))}, +gj(a){return J.ah(this.gB())}, +gA(a){return J.hx(this.gB())}, +gL(a){return J.k2(this.gB())}, +i(a){return A.hL(this)}, +$iE:1} +A.f1.prototype={ +$1(a){var s=this.a,r=A.j(s) +r.h("v.K").a(a) +s=s.k(0,a) +if(s==null)s=r.h("v.V").a(s) +return new A.a5(a,s,r.h("a5"))}, +$S(){return A.j(this.a).h("a5(v.K)")}} +A.f2.prototype={ +$2(a,b){var s,r=this.a +if(!r.a)this.b.a+=", " +r.a=!1 +r=this.b +s=A.l(a) +s=r.a+=s +r.a=s+": " +s=A.l(b) +r.a+=s}, +$S:14} +A.bc.prototype={ +gA(a){return this.gj(this)===0}, +T(a,b){var s +for(s=J.aa(A.j(this).h("e<1>").a(b));s.l();)this.t(0,s.gm())}, +dY(a){var s,r +for(s=a.length,r=0;r0}, +gB(){if(this.b==null){var s=this.c +return new A.at(s,A.j(s).h("at<1>"))}return new A.ea(this)}, +F(a,b){var s,r,q,p,o=this +t.cA.a(b) +if(o.b==null)return o.c.F(0,b) +s=o.az() +for(r=0;r=0&&b"))}return s}} +A.db.prototype={} +A.df.prototype={} +A.eY.prototype={ +dC(a,b,c){var s=A.lR(b,this.gdD().a) +return s}, +gdD(){return B.a4}} +A.eZ.prototype={} +A.b0.prototype={ +P(a,b){var s +if(b==null)return!1 +s=!1 +if(b instanceof A.b0)if(this.a===b.a)s=this.b===b.b +return s}, +gu(a){return A.ky(this.a,this.b,B.i,B.i)}, +U(a,b){var s +t.dy.a(b) +s=B.c.U(this.a,b.a) +if(s!==0)return s +return B.c.U(this.b,b.b)}, +i(a){var s=this,r=A.kg(A.kJ(s)),q=A.dg(A.kH(s)),p=A.dg(A.kD(s)),o=A.dg(A.kE(s)),n=A.dg(A.kG(s)),m=A.dg(A.kI(s)),l=A.it(A.kF(s)),k=s.b,j=k===0?"":A.it(k) +return r+"-"+q+"-"+p+" "+o+":"+n+":"+m+"."+l+j+"Z"}, +$ia4:1} +A.aI.prototype={ +P(a,b){if(b==null)return!1 +return b instanceof A.aI&&this.a===b.a}, +gu(a){return B.c.gu(this.a)}, +U(a,b){return B.c.U(this.a,t.fu.a(b).a)}, +i(a){var s,r,q,p=this.a,o=p%36e8,n=B.c.bV(o,6e7) +o%=6e7 +s=n<10?"0":"" +r=B.c.bV(o,1e6) +q=r<10?"0":"" +return""+(p/36e8|0)+":"+s+n+":"+q+r+"."+B.d.cc(B.c.i(o%1e6),6,"0")}, +$ia4:1} +A.fE.prototype={ +i(a){return this.aA()}} +A.w.prototype={ +ga7(){return A.kC(this)}} +A.bU.prototype={ +i(a){var s=this.a +if(s!=null)return"Assertion failed: "+A.dj(s) +return"Assertion failed"}} +A.ax.prototype={} +A.a3.prototype={ +gb5(){return"Invalid argument"+(!this.a?"(s)":"")}, +gb4(){return""}, +i(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+p,n=s.gb5()+q+o +if(!s.a)return n +return n+s.gb4()+": "+A.dj(s.gbj())}, +gbj(){return this.b}} +A.cc.prototype={ +gbj(){return A.lp(this.b)}, +gb5(){return"RangeError"}, +gb4(){var s,r=this.e,q=this.f +if(r==null)s=q!=null?": Not less than or equal to "+A.l(q):"" +else if(q==null)s=": Not greater than or equal to "+A.l(r) +else if(q>r)s=": Not in inclusive range "+A.l(r)+".."+A.l(q) +else s=q78)q=B.d.aS(q,0,75)+"..." +return r+"\n"+q}else return r}} +A.e.prototype={ +a1(a,b){return A.ka(this,A.j(this).h("e.E"),b)}, +al(a,b,c){var s=A.j(this) +return A.kw(this,s.q(c).h("1(e.E)").a(b),s.h("e.E"),c)}, +aj(a,b){var s,r,q=this.gv(this) +if(!q.l())return"" +s=J.am(q.gm()) +if(!q.l())return s +if(b.length===0){r=s +do r+=J.am(q.gm()) +while(q.l())}else{r=s +do r=r+b+J.am(q.gm()) +while(q.l())}return r.charCodeAt(0)==0?r:r}, +aP(a){return A.aM(this,!0,A.j(this).h("e.E"))}, +gj(a){var s,r=this.gv(this) +for(s=0;r.l();)++s +return s}, +gA(a){return!this.gv(this).l()}, +gL(a){return!this.gA(this)}, +C(a,b){var s,r +A.hM(b,"index") +s=this.gv(this) +for(r=b;s.l();){if(r===0)return s.gm();--r}throw A.c(A.bp(b,b-r,this,"index"))}, +i(a){return A.ko(this,"(",")")}} +A.a5.prototype={ +i(a){return"MapEntry("+A.l(this.a)+": "+A.l(this.b)+")"}} +A.I.prototype={ +gu(a){return A.o.prototype.gu.call(this,0)}, +i(a){return"null"}} +A.o.prototype={$io:1, +P(a,b){return this===b}, +gu(a){return A.dB(this)}, +i(a){return"Instance of '"+A.fg(this)+"'"}, +gO(a){return A.P(this)}, +toString(){return this.i(this)}} +A.ej.prototype={ +i(a){return""}, +$iaO:1} +A.dI.prototype={ +gj(a){return this.a.length}, +i(a){var s=this.a +return s.charCodeAt(0)==0?s:s}} +A.d.prototype={$id:1} +A.d1.prototype={ +i(a){var s=String(a) +s.toString +return s}} +A.d3.prototype={ +i(a){var s=String(a) +s.toString +return s}} +A.bm.prototype={$ibm:1} +A.d5.prototype={} +A.aX.prototype={$iaX:1} +A.aZ.prototype={ +gj(a){return a.length}} +A.bo.prototype={$ibo:1} +A.b1.prototype={} +A.eC.prototype={ +i(a){var s=String(a) +s.toString +return s}} +A.di.prototype={ +dA(a,b){var s=a.createHTMLDocument(b) +s.toString +return s}} +A.cw.prototype={ +gj(a){return this.a.length}, +k(a,b){var s=this.a +if(!(b>=0&&b>>0!==b||b>=s +r.toString +if(r)throw A.c(A.bp(b,s,a,null)) +s=a[b] +s.toString +return s}, +p(a,b,c){t.c8.a(c) +throw A.c(A.az("Cannot assign element of immutable List."))}, +C(a,b){if(!(b>=0&&b=0&&b"))}, +gj(a){return this.a.childNodes.length}, +k(a,b){var s=this.a.childNodes +if(!(b>=0&&b>>0!==b||b>=s +r.toString +if(r)throw A.c(A.bp(b,s,a,null)) +s=a[b] +s.toString +return s}, +p(a,b,c){t.A.a(c) +throw A.c(A.az("Cannot assign element of immutable List."))}, +C(a,b){if(!(b>=0&&b") +return new A.aQ(A.aM(new A.aA(q,s.h("O(p.E)").a(new A.fk()),r),!0,r.h("e.E")),t.ep)}else{q=a.selectedIndex +q.toString +s=t.ej +return q<0?A.f([],s):A.f([J.bT(this.gcb(a).a,q)],s)}}, +$ibb:1} +A.fk.prototype={ +$1(a){var s=t.w.a(a).selected +s.toString +return s}, +$S:15} +A.bC.prototype={$ibC:1} +A.aP.prototype={$iaP:1} +A.bD.prototype={$ibD:1} +A.T.prototype={} +A.cr.prototype={$ify:1} +A.bH.prototype={$ibH:1} +A.cE.prototype={ +gj(a){var s=a.length +s.toString +return s}, +k(a,b){var s=a.length,r=b>>>0!==b||b>=s +r.toString +if(r)throw A.c(A.bp(b,s,a,null)) +s=a[b] +s.toString +return s}, +p(a,b,c){t.A.a(c) +throw A.c(A.az("Cannot assign element of immutable List."))}, +C(a,b){if(!(b>=0&&b"))}} +A.fa.prototype={ +aF(a){return B.a.c3(this.a,new A.fc(a))}, +af(a,b,c){return B.a.c3(this.a,new A.fb(a,b,c))}, +$ib9:1} +A.fc.prototype={ +$1(a){return t.f6.a(a).aF(this.a)}, +$S:8} +A.fb.prototype={ +$1(a){return t.f6.a(a).af(this.a,this.b,this.c)}, +$S:8} +A.b3.prototype={ +l(){var s=this,r=s.c+1,q=s.b +if(r") +return}if(!l.a.aF(a)){l.ae(a,b) +window.toString +s=A.l(b) +r=typeof console!="undefined" +r.toString +if(r)window.console.warn("Removing disallowed element <"+e+"> from "+s) +return}if(g!=null)if(!l.a.af(a,"is",g)){l.ae(a,b) +window.toString +s=typeof console!="undefined" +s.toString +if(s)window.console.warn("Removing disallowed type extension <"+e+' is="'+g+'">') +return}s=f.gB() +q=A.f(s.slice(0),A.K(s)) +for(p=f.gB().length-1,s=f.a,r="Removing disallowed attribute <"+e+" ";p>=0;--p){if(!(p') +s.removeAttribute(o)}}if(t.aW.b(a)){s=a.content +s.toString +l.bv(s)}}, +cp(a,b){var s=a.nodeType +s.toString +switch(s){case 1:this.d7(a,b) +break +case 8:case 11:case 3:case 4:break +default:this.ae(a,b)}}, +$ikx:1} +A.h1.prototype={ +$2(a,b){var s,r,q,p,o,n,m=this.a +m.cp(a,b) +s=a.lastChild +for(q=t.A;s!=null;){r=null +try{r=s.previousSibling +if(r!=null){p=r.nextSibling +o=s +o=p==null?o!=null:p!==o +p=o}else p=!1 +if(p){p=A.dF("Corrupt HTML") +throw A.c(p)}}catch(n){p=q.a(s);++m.b +o=p.parentNode +if(a!==o){if(o!=null)o.removeChild(p).toString}else a.removeChild(p).toString +s=null +r=a.lastChild}if(s!=null)this.$2(s,a) +s=r}}, +$S:18} +A.e5.prototype={} +A.e6.prototype={} +A.ed.prototype={} +A.ee.prototype={} +A.es.prototype={} +A.et.prototype={} +A.dR.prototype={ +gci(a){var s=a.target +s.toString +return s}} +A.hr.prototype={ +$1(a){return this.a.bd(0,this.b.h("0/?").a(a))}, +$S:3} +A.hs.prototype={ +$1(a){if(a==null)return this.a.c6(new A.fd(a===undefined)) +return this.a.c6(a)}, +$S:3} +A.fd.prototype={ +i(a){return"Promise was rejected with a value of `"+(this.a?"undefined":"null")+"`."}} +A.d7.prototype={ +dB(){var s,r +this.e===$&&A.cZ() +s=document +s.toString +r=this.d +r===$&&A.cZ() +r=s.querySelector(r) +r.toString +r=A.kP(r,null) +return r}} +A.e_.prototype={} +A.ai.prototype={ +dv(){var s=this.c +if(s!=null)s.F(0,new A.eD()) +this.sc9(null)}, +bN(a,b,c){var s +if(c!=null&&c!=="http://www.w3.org/1999/xhtml"){s=document +s.toString +s=s.createElementNS(A.D(c),b) +return s}s=document.createElement(b) +return s}, +cl(a2,a3,a4,a5,a6,a7){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=this,a0=null,a1=t.cZ +a1.a(a5) +a1.a(a6) +t.dn.a(a7) +s=A.iS() +r=A.iS() +q=B.a7.k(0,a2) +a1=a.d +p=a1==null?a0:a1.a +o=q==null +if(o){n=t.h.b(p) +m=p}else{m=a0 +n=!1}if(n){n=o?m:p +q=t.h.a(n).namespaceURI}$label0$0:{n=a.a +if(n==null){l=a1.b +a1=l.length +if(a1!==0)for(n=t.h,k=0;k") +a.scj(A.aM(new A.aA(new A.bI(j),a1.h("O(p.E)").a(new A.eE()),n),!0,n.h("e.E"))) +break $label0$0}}r.b=a.a=a.bN(0,a2,q) +s.b=A.iD(t.N)}else{a1=t.h +if(!a1.b(n)||n.tagName.toLowerCase()!==a2){r.b=a.bN(0,a2,q) +i=a.a +i.toString +J.hz(i,r.M()) +a.sdS(r.M()) +a1=i.childNodes +a1.toString +a1=B.a8.gA(a1) +if(!a1){a1=i.childNodes +a1.toString +a1=A.aM(a1,!0,t.A) +for(n=a1.length,k=0;k") +b=A.iC(n.h("e.E")) +b.T(0,new A.at(a1,n))}if(a.c==null)a.sc9(A.aj(t.N,t.U)) +a1=a.c +a1.toString +a7.F(0,new A.eG(b,a1,r)) +if(b!=null)b.F(0,new A.eH(a1))}else a.dv()}, +br(a){var s,r,q,p,o,n=this +$label0$0:{s=n.a +if(s==null){r=n.d.b +s=r.length +if(s!==0)for(q=t.x,p=0;p864e13)A.bl(A.bA(s,-864e13,864e13,"millisecondsSinceEpoch",null)) +A.he(!0,"isUtc",t.y) +s=new A.b0(s,0,!0) +break $label0$0}if(B.q===r){s=s.files +break $label0$0}s=s.value +break $label0$0}return s}, +$S:37} +A.h4.prototype={ +$1(a){return t.u.a(a).b===this.a.type}, +$S:25} +A.h6.prototype={ +$1(a){var s=t.w.a(a).value +s.toString +return s}, +$S:26} +A.cg.prototype={ +aA(){return"SchedulerPhase."+this.b}} +A.fi.prototype={ +cq(a){var s=t.M +A.jA(s.a(new A.fj(this,s.a(a))))}, +cT(){var s,r=this.b$,q=A.aM(r,!0,t.M) +B.a.K(r) +for(r=q.length,s=0;s" +break $label0$1}s=a.bs(0) +s.toString +break $label0$1}return s}, +$S:27} +A.d8.prototype={ +bm(a){var s=0,r=A.cV(t.H) +var $async$bm=A.cW(function(b,c){if(b===1)return A.cQ(c,r) +while(true)switch(s){case 0:a.aq(null,null) +a.E() +return A.cR(null,r)}}) +return A.cS($async$bm,r)}, +bw(a){var s=this +if(a.at){s.e=!0 +return}if(!s.b){a.f.cq(s.gdV()) +s.b=!0}B.a.t(s.a,a) +a.at=!0}, +ak(a){return this.dQ(t.O.a(a))}, +dQ(a){var s=0,r=A.cV(t.H),q=1,p,o=[],n +var $async$ak=A.cW(function(b,c){if(b===1){p=c +s=q}while(true)switch(s){case 0:q=2 +n=a.$0() +s=n instanceof A.u?5:6 +break +case 5:s=7 +return A.eu(n,$async$ak) +case 7:case 6:o.push(4) +s=3 +break +case 2:o=[1] +case 3:q=1 +s=o.pop() +break +case 4:return A.cR(null,r) +case 1:return A.cQ(p,r)}}) +return A.cS($async$ak,r)}, +dW(){var s,r,q,p,o,n,m,l,k,j,i=this +try{n=i.a +B.a.aR(n,A.i5()) +i.e=!1 +s=n.length +r=0 +while(!0){m=r +l=s +if(typeof m!=="number")return m.co() +if(typeof l!=="number")return A.me(l) +if(!(m0){l=r +if(typeof l!=="number")return l.ct() +l=B.a.k(n,l-1).as}else l=m +if(!l)break +l=r +if(typeof l!=="number")return l.ct() +r=l-1}}}}finally{for(n=i.a,m=n.length,j=0;j=0&&p")),s=s.c;p.l();){r=p.d;(r==null?s.a(r):r).ed(q)}q.sb6(null) +q.w=B.ag}, +bp(){var s=this,r=s.gn().a +if(r instanceof A.ab)if(J.F($.dd.k(0,r),s))$.dd.G(0,r) +s.e=s.ay=null +s.scQ(null) +s.w=B.ah}, +aD(){var s=this.a +this.sb6(s==null?null:s.y)}, +c2(){var s=this.a +this.scY(s==null?null:s.x)}, +c4(){var s=this.a +this.b=s==null?null:s.b}, +aJ(){this.bl()}, +bl(){var s=this +if(s.w!==B.f)return +if(s.as)return +s.as=!0 +s.r.bw(s)}, +an(){var s,r=this +if(r.w!==B.f||!r.as)return +r.r.toString +s=t.M.a(new A.eM(r)) +r.a4() +s.$0() +r.ag()}, +ag(){}, +ai(){this.I(new A.eL())}, +bq(a){var s,r=this +r.cx=a +r.cy=a==null?null:a.ga_() +s=r.a +if(J.F(s==null?null:s.cx,r)){s=r.a +s=s==null?null:s.ga_() +s=!J.F(s,r.ga_())}else s=!1 +if(s)r.a.bq(r)}, +cm(a){var s=this +s.ch=a +s.c0(s.db) +s.db=!1}, +ac(){}, +c0(a){var s,r=this,q=r.ch +if(q==null){s=r.a +if(t.X.b(s))q=null +else{s=s==null?null:s.CW +q=s}}if(a||!J.F(q,r.CW)){r.CW=q +r.ac() +if(!t.X.b(r))r.I(new A.eJ())}}, +scY(a){this.x=t.gV.a(a)}, +sb6(a){this.y=t.fY.a(a)}, +scQ(a){this.z=t.dl.a(a)}, +$iQ:1, +ga_(){return this.cy}} +A.eN.prototype={ +$1(a){var s +if(a!=null)s=this.a.V(0,a) +else s=!1 +return s?null:a}, +$S:29} +A.eK.prototype={ +$1(a){a.c1(this.a)}, +$S:2} +A.eM.prototype={ +$0(){var s,r,q=this.a,p=q.z +if(p!=null&&p.a!==0)for(s=A.j(p),p=new A.aC(p,p.b2(),s.h("aC<1>")),s=s.c;p.l();){r=p.d;(r==null?s.a(r):r).ee(q)}}, +$S:0} +A.eL.prototype={ +$1(a){a.ai()}, +$S:2} +A.eJ.prototype={ +$1(a){return a.c0(!0)}, +$S:2} +A.e8.prototype={ +c_(a){a.I(new A.fW(this)) +a.bp()}, +dh(){var s,r,q=this.a,p=A.aM(q,!0,A.j(q).c) +B.a.aR(p,A.i5()) +q.K(0) +for(q=A.K(p).h("cf<1>"),s=new A.cf(p,q),s=new A.au(s,s.gj(0),q.h("au")),q=q.h("H.E");s.l();){r=s.d +this.c_(r==null?q.a(r):r)}}} +A.fW.prototype={ +$1(a){this.a.c_(a)}, +$S:2} +A.b6.prototype={} +A.dy.prototype={} +A.bG.prototype={ +P(a,b){if(b==null)return!1 +return J.ih(b)===A.P(this)&&this.$ti.b(b)&&b.a===this.a}, +gu(a){return A.kz([A.P(this),this.a])}, +i(a){var s=this.$ti,r=s.c,q=this.a,p=A.a8(r)===B.af?"<'"+q+"'>":"<"+q+">" +if(A.P(this)===A.a8(s))return"["+p+"]" +return"["+A.a8(r).i(0)+" "+p+"]"}} +A.ab.prototype={ +gbf(){var s,r=$.dd.k(0,this) +if(r instanceof A.cl){s=r.y1 +s.toString +if(this.$ti.c.b(s))return s}return null}} +A.aN.prototype={ +X(a){return A.kL(this)}} +A.bz.prototype={ +am(a,b){this.aq(a,b)}, +E(){this.an() +this.aV()}, +a6(a){t.E.a(a) +return!0}, +a4(){var s,r,q,p,o=this +o.as=!1 +s=t.E.a(o.gn()) +r=s.c +if(r==null){q=A.f([],t.i) +p=s.b +if(p!=null)q.push(p) +r=q}q=o.dx +if(q==null)q=A.f([],t.k) +p=o.dy +o.saZ(0,o.ck(q,r,p)) +p.K(0)}, +I(a){var s,r,q,p +t.L.a(a) +s=this.dx +s=J.aa(s==null?[]:s) +r=this.dy +q=t.I +for(;s.l();){p=s.gm() +if(!r.V(0,p))a.$1(q.a(p))}}, +aL(a){this.dy.t(0,a) +this.bE(a)}, +saZ(a,b){this.dx=t.d5.a(b)}} +A.c5.prototype={ +am(a,b){this.aq(a,b)}, +E(){this.an() +this.aV()}, +a6(a){return!1}, +a4(){this.as=!1}, +I(a){t.L.a(a)}} +A.ce.prototype={} +A.bW.prototype={ +E(){var s,r,q=this +if(q.d$==null){s=q.ay.d$ +s.toString +r=new A.ai(A.f([],t.e)) +r.d=s +q.d$=r +q.Y()}q.aT()}, +a5(a){this.e$=!0 +this.ar(a)}, +a3(a){var s=this +if(s.e$){s.e$=!1 +s.Y()}s.ap(a)}, +ac(){this.aU() +this.ag()}} +A.cb.prototype={ +E(){var s,r,q=this +if(q.d$==null){s=q.ay.d$ +s.toString +r=new A.ai(A.f([],t.e)) +r.d=s +q.d$=r +q.Y()}q.cG()}, +a5(a){if(this.bx(a))this.e$=!0 +this.ar(a)}, +a3(a){var s=this +if(s.e$){s.e$=!1 +s.Y()}s.ap(a)}, +ac(){this.aU() +this.ag()}} +A.c6.prototype={ +E(){var s,r,q=this +if(q.d$==null){s=q.ay.d$ +s.toString +r=new A.ai(A.f([],t.e)) +r.d=s +q.d$=r +s=q.e +s.toString +r.br(t.t.a(s).b)}q.cE()}, +a5(a){var s,r=t.t +r.a(a) +s=this.e +s.toString +if(r.a(s).b!==a.b)this.e$=!0 +this.ar(a)}, +a3(a){var s,r,q=this +if(q.e$){q.e$=!1 +s=q.d$ +s.toString +r=q.e +r.toString +s.br(t.t.a(r).b)}q.ap(a)}, +ac(){this.aU() +this.ag()}} +A.a_.prototype={ +bx(a){return!0}, +ag(){var s,r,q,p,o=this.ay +if(o==null)s=null +else{o=o.d$ +o.toString +s=o}if(s!=null){r=this.CW +while(!0){o=r==null +if(!(!o&&r.ga_()==null))break +r=r.CW}q=o?null:r.ga_() +o=this.d$ +o.toString +if(q==null)p=null +else{p=q.d$ +p.toString}s.bb(o,p)}}, +ai(){var s,r,q=this.ay +if(q==null)s=null +else{q=q.d$ +q.toString +s=q}if(s!=null){q=this.d$ +r=q.a +if(r!=null)J.hy(r) +q.d=null}}, +ga_(){return this}} +A.a7.prototype={ +X(a){var s=this.ah(),r=A.b5(t.I),q=($.M+1)%16777215 +$.M=q +q=new A.cl(s,r,q,this,B.e) +s.c=q +s.sbM(this) +return q}} +A.J.prototype={ +aM(){}, +R(a){t.M.a(a).$0() +this.c.bl()}, +sbM(a){this.a=A.j(this).h("J.T?").a(a)}} +A.cl.prototype={ +aH(){return this.y1.D(this)}, +E(){var s=this +if(s.r.c)s.y1.toString +s.cV() +s.aT()}, +cV(){try{this.y1.aM()}finally{}this.y1.toString}, +a4(){var s=this +s.r.toString +if(s.bh){s.y1.toString +s.bh=!1}s.bC()}, +a6(a){var s +t.D.a(a) +s=this.y1 +s.toString +A.j(s).h("J.T").a(a) +return!0}, +a5(a){t.D.a(a) +this.ar(a) +this.y1.sbM(a)}, +a3(a){var s +t.D.a(a) +try{s=this.y1 +s.toString +A.j(s).h("J.T").a(a)}finally{}this.ap(a)}, +aE(){this.cA() +this.y1.toString +this.bl()}, +a2(){this.y1.toString +this.cB()}, +bp(){this.cC() +this.y1.c=null +this.sde(null)}, +aJ(){this.bD() +this.bh=!0}, +sde(a){this.y1=t.gf.a(a)}} +A.bd.prototype={ +X(a){var s=A.b5(t.I),r=($.M+1)%16777215 +$.M=r +return new A.dG(s,r,this,B.e)}} +A.dG.prototype={ +gn(){return t.q.a(A.k.prototype.gn.call(this))}, +E(){if(this.r.c)this.f.toString +this.aT()}, +a6(a){t.q.a(A.k.prototype.gn.call(this)) +return!0}, +aH(){return t.q.a(A.k.prototype.gn.call(this)).D(this)}, +a4(){this.r.toString +this.bC()}} +A.dk.prototype={ +D(a){return new A.U(this.dm(a),t.d)}, +dm(a){var s=this +return function(){var r=a +var q=0,p=1,o,n,m,l,k,j,i,h,g,f,e +return function $async$D(b,c,d){if(c===1){o=d +q=p}while(true)switch(q){case 0:n=s.c,m=n.length,l=t.i,k=t.z,j=0 +case 2:if(!(j1?2:4 +break +case 2:n=s.d +n=n==null?null:new A.aD("px",n) +n=A.iR(null,n==null?new A.aD("px",25):n) +m=t.i +l=t.N +q=5 +return b.b=A.ak(A.f([A.ia(A.f([A.ic(A.f([new A.C(s.a.c+":",null)],m)),new A.C(" "+A.l(B.a.gbi(k))+" ",null),new A.G("pre",null,null,null,null,null,null,A.f([new A.C(A.kS(k,1,null,l).aj(0,"\n"),null)],m),null)],m))],m),"content",null,null,n),1 +case 5:l=A.dw(["click",new A.eT(s)],l,t.Q) +q=6 +return b.b=A.ak(A.f([new A.ba(s.d!=null?"Show less ▲":"Show more ▼",null)],m),"show-more",l,null,null),1 +case 6:q=3 +break +case 4:n=t.i +q=7 +return b.b=A.ia(A.f([A.ic(A.f([new A.C(s.a.c+":",null)],n)),new A.C(" "+s.a.d+" ",null)],n)),1 +case 7:case 3:return 0 +case 1:return b.c=o,3}}}}} +A.eT.prototype={ +$1(a){var s,r,q +t.B.a(a) +s=this.a +if(s.d!=null)s.R(new A.eR(s)) +else{r=t.dg.a(J.ii(a)) +q=null +if(!(r==null)){r=r.previousElementSibling +if(!(r==null)){r=r.scrollHeight +r.toString +r=B.h.cf(r) +q=r}}s.R(new A.eS(s,q))}}, +$S:1} +A.eR.prototype={ +$0(){return this.a.d=null}, +$S:0} +A.eS.prototype={ +$0(){return this.a.d=this.b}, +$S:0} +A.bv.prototype={ +ah(){return new A.bw()}} +A.bw.prototype={ +aM(){this.bF() +var s=window +s.toString +A.fF(s,"keydown",t.c9.a(new A.f6(this)),!1,t.G)}, +dU(a,b){this.R(new A.f7(this,b))}, +c5(a){this.R(new A.f5(this))}, +bA(){if(this.d==null)return +this.R(new A.f9(this))}, +bz(){if(this.d==null)return +this.R(new A.f8(this))}, +gc8(){var s,r=this.d +if(r!=null){s=this.a.c +if(r>>>0!==r||r>=s.length)return A.n(s,r) +r=s[r]}else r=null +return r}, +D(a){return new A.U(this.dq(a),t.d)}, +dq(a){var s=this +return function(){var r=a +var q=0,p=1,o,n,m,l,k,j,i,h,g,f +return function $async$D(b,c,d){if(c===1){o=d +q=p}while(true)switch(q){case 0:i=s.d!=null?"show":"" +h=s.gdw(s) +g=t.z +f=A.bR(null,h,null,g,g) +g=A.bR(null,h,null,g,g) +h=t.i +g=A.ib(A.f([new A.ba("×",null)],h),"close",g) +n=s.gc8() +n=n==null?null:n.c +n=A.i6("Screenshot of the Event",null,null,null,n==null?"":n) +m=t.N +l=t.Q +k=A.dw(["click",new A.f3(s)],m,l) +k=A.hd(A.f([new A.ba("❮",null)],h),"nav nav-left",k,"") +j=s.gc8() +j=j==null?null:j.a +j=A.ak(A.f([new A.C(j==null?"":j,null)],h),null,null,null,null) +l=A.dw(["click",new A.f4(s)],m,l) +q=2 +return b.b=A.ak(A.f([g,A.ak(A.f([n,A.ak(A.f([k,j,A.hd(A.f([new A.ba("❯",null)],h),"nav nav-right",l,"")],h),"caption",null,null,null)],h),"modal-content",null,null,null)],h),"modal "+i,f,null,null),1 +case 2:return 0 +case 1:return b.c=o,3}}}}} +A.f6.prototype={ +$1(a){var s +t.G.a(a) +s=a.key +if(s==="Escape"){this.a.c5(0) +a.preventDefault() +a.stopPropagation()}else if(s==="ArrowLeft"){this.a.bA() +a.preventDefault() +a.stopPropagation()}else if(s==="ArrowRight"){this.a.bz() +a.preventDefault() +a.stopPropagation()}}, +$S:31} +A.f7.prototype={ +$0(){var s=this.a +s.d=B.a.dK(s.a.c,this.b)}, +$S:0} +A.f5.prototype={ +$0(){this.a.d=null}, +$S:0} +A.f9.prototype={ +$0(){var s=this.a,r=s.d +r.toString +s.d=B.c.bt(r-1,s.a.c.length)}, +$S:0} +A.f8.prototype={ +$0(){var s=this.a,r=s.d +r.toString +s.d=B.c.bt(r+1,s.a.c.length)}, +$S:0} +A.f3.prototype={ +$1(a){var s=J.V(a) +s.cd(a) +s.bB(a) +this.a.bA()}, +$S:3} +A.f4.prototype={ +$1(a){var s=J.V(a) +s.cd(a) +s.bB(a) +this.a.bz()}, +$S:3} +A.bB.prototype={ +ah(){return new A.ci()}} +A.ci.prototype={ +by(a,b){this.R(new A.fo(this,b))}, +D(a){return new A.U(this.dt(a),t.d)}, +dt(a){var s=this +return function(){var r=a +var q=0,p=1,o,n,m,l +return function $async$D(b,c,d){if(c===1){o=d +q=p}while(true)switch(q){case 0:n=s.d +m=n==null +l=!m?"show":"" +q=2 +return b.b=A.ak(A.f([new A.C(m?"":n,null)],t.i),"snackbar "+l,null,"snackbar",null),1 +case 2:return 0 +case 1:return b.c=o,3}}}}} +A.fo.prototype={ +$0(){var s,r=this.a +r.d=this.b +s=r.e +if(s!=null)s.aI() +r.e=A.kV(B.K,new A.fn(r))}, +$S:0} +A.fn.prototype={ +$0(){var s=this.a +s.R(new A.fm(s))}, +$S:0} +A.fm.prototype={ +$0(){return this.a.d=null}, +$S:0} +A.bE.prototype={ +ah(){return new A.dO(new A.ab(t.dW),new A.ab(t.cX))}} +A.dO.prototype={ +D(a){var s=this,r=null,q="horizontal-spacer",p=t.i,o=A.f([A.ak(A.f([A.i6(r,r,r,100,"https://user-images.githubusercontent.com/1096485/188243198-7abfc785-8ecd-40cb-bb28-5561610432a4.png"),new A.G("h1",r,r,r,r,r,r,A.f([new A.C("Timeline",r)],p),r)],p),"header",r,r,r),A.ak(A.f([A.jt(A.f([new A.C("Info",r)],p))],p),q,r,r,r),A.ia(A.f([A.ic(A.f([new A.C("Test:",r)],p)),new A.C(" "+s.a.d,r)],p)),A.jq(A.f([new A.C("Copy test command",r)],p),"button-spot",new A.fu(s)),new A.bB(s.d)],p) +if(s.a.e.length!==0)B.a.T(o,A.f([A.ak(A.f([A.jt(A.f([new A.C("Events",r)],p))],p),q,r,r,r),new A.G("section",r,"events",r,r,r,r,A.f([new A.dk(s.a.e,new A.fv(s),r)],p),r)],p)) +o.push(A.ak(A.f([new A.C("Tell us how to improve the timeline at ",r),A.hd(A.f([new A.C("github.com/passsy/spot",r)],p),r,r,"https://github.com/passsy/spot/issues")],p),r,r,r,r)) +o.push(new A.bv(s.a.e,s.e)) +return o}} +A.fu.prototype={ +$0(){var s=0,r=A.cV(t.H),q=1,p,o=this,n,m,l,k,j,i +var $async$$0=A.cW(function(a,b){if(a===1){p=b +s=q}while(true)switch(s){case 0:k=o.a +j='flutter test --plain-name="'+k.a.c+'"' +q=3 +n=window.navigator.clipboard +if(n==null)n=null +else{n=n.writeText(A.D(j)) +n.toString +n=A.mp(n,t.z)}if(!(n instanceof A.u)){m=new A.u($.r,t.c) +m.a=8 +m.c=n +n=m}s=6 +return A.eu(n,$async$$0) +case 6:k.d.gbf().by(0,"Test command copied to clipboard") +q=1 +s=5 +break +case 3:q=2 +i=p +k.d.gbf().by(0,"Failed to copy test command") +s=5 +break +case 2:s=1 +break +case 5:return A.cR(null,r) +case 1:return A.cQ(p,r)}}) +return A.cS($async$$0,r)}, +$S:7} +A.fv.prototype={ +$1(a){t.g9.a(a) +this.a.e.gbf().dU(0,a)}, +$S:32} +A.b_.prototype={ +ah(){return new A.e0()}} +A.e0.prototype={ +D(a){return new A.U(this.du(a),t.d)}, +du(a){var s=this +return function(){var r=a +var q=0,p=1,o,n,m,l +return function $async$D(b,c,d){if(c===1){o=d +q=p}while(true)switch(q){case 0:l=s.d +l===$&&A.cZ() +n=s.e +n===$&&A.cZ() +m=s.f +m===$&&A.cZ() +q=2 +return b.b=new A.bE(l,n,m,null),1 +case 2:return 0 +case 1:return b.c=o,3}}}}, +scJ(a){this.f=t.W.a(a)}} +A.er.prototype={ +aM(){this.bF() +A.mi(this)}} +A.ad.prototype={};(function aliases(){var s=J.c2.prototype +s.cD=s.i +s=J.b7.prototype +s.cF=s.i +s=A.ai.prototype +s.cw=s.bb +s=A.bV.prototype +s.aT=s.E +s.bC=s.a4 +s=A.dc.prototype +s.cv=s.aG +s=A.k.prototype +s.aq=s.am +s.aV=s.E +s.ar=s.a5 +s.ap=s.a3 +s.bE=s.aL +s.cA=s.aE +s.cB=s.a2 +s.cC=s.bp +s.cz=s.aD +s.bD=s.aJ +s.aU=s.ac +s=A.bz.prototype +s.cG=s.E +s=A.c5.prototype +s.cE=s.E +s=A.J.prototype +s.bF=s.aM})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._static_1,q=hunkHelpers._static_0,p=hunkHelpers.installStaticTearOff,o=hunkHelpers._instance_0u,n=hunkHelpers._instance_0i +s(J,"lE","kr",33) +r(A,"m2","kX",4) +r(A,"m3","kY",4) +r(A,"m4","kZ",4) +q(A,"jp","lW",0) +p(A,"m8",0,null,["$2$3$onChange$onClick$onInput","$0","$2$0","$2$1$onClick"],["bR",function(){var m=t.z +return A.bR(null,null,null,m,m)},function(a,b){return A.bR(null,null,null,a,b)},function(a,b,c){return A.bR(null,a,null,b,c)}],35,0) +s(A,"i5","ki",36) +r(A,"jr","kh",2) +r(A,"hh","l1",2) +o(A.d8.prototype,"gdV","dW",0) +o(A.e8.prototype,"gdg","dh",0) +n(A.bw.prototype,"gdw","c5",0) +r(A,"mu","kT",24)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.mixinHard,q=hunkHelpers.inherit,p=hunkHelpers.inheritMany +q(A.o,null) +p(A.o,[A.hH,J.c2,J.aW,A.e,A.bX,A.w,A.aH,A.fl,A.au,A.c8,A.cq,A.co,A.p,A.bY,A.cC,A.fw,A.fe,A.c0,A.cG,A.v,A.f_,A.c7,A.ef,A.dt,A.cD,A.dT,A.fD,A.a6,A.e7,A.em,A.el,A.dW,A.cH,A.an,A.e1,A.aB,A.u,A.dX,A.cm,A.ei,A.cN,A.cz,A.bc,A.aC,A.eb,A.bi,A.db,A.df,A.b0,A.aI,A.fE,A.dz,A.cj,A.fI,A.eU,A.a5,A.I,A.ej,A.dI,A.eP,A.hE,A.cv,A.fV,A.Y,A.fa,A.b3,A.e3,A.ep,A.fd,A.dU,A.ce,A.b2,A.B,A.k,A.d0,A.fi,A.dS,A.d6,A.eq,A.ec,A.en,A.ek,A.dK,A.dL,A.d8,A.dc,A.e8,A.b6,A.a_,A.J,A.ad]) +p(J.c2,[J.dr,J.c4,J.Z,J.bs,J.bu,J.br,J.aK]) +p(J.Z,[J.b7,J.z,A.q,A.d5,A.eC,A.di,A.b,A.e5,A.f0,A.ed,A.es]) +p(J.b7,[J.dA,J.be,J.aq]) +q(J.eW,J.z) +p(J.br,[J.c3,J.ds]) +p(A.e,[A.aR,A.m,A.b8,A.aA,A.cB,A.U]) +p(A.aR,[A.aY,A.cO]) +q(A.cu,A.aY) +q(A.ct,A.cO) +q(A.ao,A.ct) +p(A.w,[A.aL,A.ax,A.du,A.dQ,A.e2,A.dE,A.bU,A.e4,A.a3,A.cp,A.dP,A.ck,A.de]) +p(A.aH,[A.d9,A.da,A.dM,A.hj,A.hl,A.fA,A.fz,A.h2,A.fN,A.fU,A.fr,A.fq,A.fZ,A.f1,A.fk,A.fG,A.fH,A.fc,A.fb,A.hr,A.hs,A.eE,A.eF,A.eH,A.eO,A.hg,A.h7,A.h4,A.h6,A.hm,A.eN,A.eK,A.eL,A.eJ,A.fW,A.eT,A.f6,A.f3,A.f4,A.fv]) +p(A.d9,[A.hq,A.fB,A.fC,A.h_,A.fJ,A.fQ,A.fP,A.fM,A.fL,A.fK,A.fT,A.fS,A.fR,A.fs,A.fp,A.h8,A.hb,A.fY,A.h5,A.fj,A.eB,A.eM,A.eQ,A.eR,A.eS,A.f7,A.f5,A.f9,A.f8,A.fo,A.fn,A.fm,A.fu]) +p(A.m,[A.H,A.at,A.cy]) +p(A.H,[A.cn,A.ac,A.cf,A.ea]) +q(A.c_,A.b8) +p(A.p,[A.bF,A.cw,A.bI]) +q(A.bZ,A.bY) +q(A.ca,A.ax) +p(A.dM,[A.dH,A.bn]) +q(A.dV,A.bU) +p(A.v,[A.ar,A.cx,A.e9,A.dY]) +p(A.da,[A.eX,A.hk,A.h3,A.hc,A.fO,A.eV,A.f2,A.h1,A.eD,A.eG]) +q(A.cI,A.e4) +q(A.cs,A.e1) +q(A.eh,A.cN) +q(A.bM,A.bc) +p(A.bM,[A.cA,A.bh]) +q(A.aQ,A.bF) +q(A.eY,A.db) +q(A.eZ,A.df) +p(A.a3,[A.cc,A.dp]) +p(A.q,[A.i,A.cr]) +p(A.i,[A.a,A.aZ,A.b1,A.bH]) +q(A.d,A.a) +p(A.d,[A.d1,A.d3,A.bm,A.aX,A.dn,A.bq,A.S,A.bb,A.bC,A.bD]) +p(A.aZ,[A.bo,A.aP]) +q(A.eI,A.eP) +q(A.W,A.d5) +q(A.e6,A.e5) +q(A.dm,A.e6) +q(A.c1,A.b1) +p(A.b,[A.T,A.dR]) +q(A.as,A.T) +q(A.ee,A.ed) +q(A.bx,A.ee) +q(A.et,A.es) +q(A.cE,A.et) +q(A.bf,A.dY) +q(A.bg,A.cm) +q(A.bJ,A.bg) +q(A.d2,A.dU) +q(A.e_,A.d2) +q(A.d7,A.e_) +q(A.ai,A.ce) +q(A.dD,A.ai) +p(A.fE,[A.t,A.cg,A.eA,A.bK]) +p(A.B,[A.bd,A.cd,A.aN,A.C,A.a7]) +p(A.bd,[A.ba,A.dk]) +p(A.k,[A.bV,A.bz,A.c5]) +p(A.bV,[A.bW,A.cl,A.dG]) +q(A.dC,A.bW) +q(A.aD,A.en) +q(A.dJ,A.ek) +q(A.dZ,A.dJ) +p(A.aN,[A.eg,A.G]) +q(A.cb,A.bz) +p(A.cb,[A.cF,A.dh]) +q(A.c6,A.c5) +q(A.dN,A.c6) +p(A.b6,[A.dy,A.ab]) +q(A.bG,A.dy) +p(A.a7,[A.ap,A.bv,A.bB,A.bE,A.b_]) +p(A.J,[A.dl,A.bw,A.ci,A.dO,A.er]) +q(A.e0,A.er) +s(A.bF,A.co) +s(A.cO,A.p) +s(A.e5,A.p) +s(A.e6,A.Y) +s(A.ed,A.p) +s(A.ee,A.Y) +s(A.es,A.p) +s(A.et,A.Y) +s(A.e_,A.dc) +s(A.dU,A.fi) +s(A.ek,A.dK) +r(A.bW,A.a_) +r(A.cb,A.a_) +r(A.c6,A.a_) +r(A.er,A.dL)})() +var v={typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{af:"int",ew:"double",ag:"num",h:"String",O:"bool",I:"Null",x:"List",o:"Object",E:"Map"},mangledNames:{},types:["~()","~(b)","~(k)","~(@)","~(~())","I(@)","I()","X<~>()","O(b9)","u<@>(@)","~(af,@)","I(o,aO)","I(~())","~(@,@)","~(o?,o?)","O(S)","@(@,h)","@(h)","~(i,i?)","~(h,b2)","O(i)","h(a5)","~(h,~(b))","~(h)","ad(E)","O(t)","h(S)","h(c9)","X()","k?(k?)","@(@)","~(as)","~(ad)","af(@,@)","I(@,aO)","E({onChange:~(1^)?,onClick:~()?,onInput:~(0^)?})","af(k,k)","o?()"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{}} +A.li(v.typeUniverse,JSON.parse('{"dA":"b7","be":"b7","aq":"b7","mw":"b","mF":"b","mJ":"a","n0":"q","mx":"d","mK":"d","mN":"i","mD":"i","mZ":"b1","mz":"T","mL":"aZ","my":"aP","dr":{"O":[],"aw":[]},"c4":{"I":[],"aw":[]},"z":{"x":["1"],"m":["1"],"e":["1"]},"eW":{"z":["1"],"x":["1"],"m":["1"],"e":["1"]},"aW":{"y":["1"]},"br":{"ew":[],"ag":[],"a4":["ag"]},"c3":{"ew":[],"af":[],"ag":[],"a4":["ag"],"aw":[]},"ds":{"ew":[],"ag":[],"a4":["ag"],"aw":[]},"aK":{"h":[],"a4":["h"],"ff":[],"aw":[]},"aR":{"e":["2"]},"bX":{"y":["2"]},"aY":{"aR":["1","2"],"e":["2"],"e.E":"2"},"cu":{"aY":["1","2"],"aR":["1","2"],"m":["2"],"e":["2"],"e.E":"2"},"ct":{"p":["2"],"x":["2"],"aR":["1","2"],"m":["2"],"e":["2"]},"ao":{"ct":["1","2"],"p":["2"],"x":["2"],"aR":["1","2"],"m":["2"],"e":["2"],"p.E":"2","e.E":"2"},"aL":{"w":[]},"m":{"e":["1"]},"H":{"m":["1"],"e":["1"]},"cn":{"H":["1"],"m":["1"],"e":["1"],"e.E":"1","H.E":"1"},"au":{"y":["1"]},"b8":{"e":["2"],"e.E":"2"},"c_":{"b8":["1","2"],"m":["2"],"e":["2"],"e.E":"2"},"c8":{"y":["2"]},"ac":{"H":["2"],"m":["2"],"e":["2"],"e.E":"2","H.E":"2"},"aA":{"e":["1"],"e.E":"1"},"cq":{"y":["1"]},"bF":{"p":["1"],"co":["1"],"x":["1"],"m":["1"],"e":["1"]},"cf":{"H":["1"],"m":["1"],"e":["1"],"e.E":"1","H.E":"1"},"bY":{"E":["1","2"]},"bZ":{"bY":["1","2"],"E":["1","2"]},"cB":{"e":["1"],"e.E":"1"},"cC":{"y":["1"]},"ca":{"ax":[],"w":[]},"du":{"w":[]},"dQ":{"w":[]},"cG":{"aO":[]},"aH":{"b4":[]},"d9":{"b4":[]},"da":{"b4":[]},"dM":{"b4":[]},"dH":{"b4":[]},"bn":{"b4":[]},"e2":{"w":[]},"dE":{"w":[]},"dV":{"w":[]},"ar":{"v":["1","2"],"iB":["1","2"],"E":["1","2"],"v.K":"1","v.V":"2"},"at":{"m":["1"],"e":["1"],"e.E":"1"},"c7":{"y":["1"]},"dt":{"kO":[],"ff":[]},"cD":{"fh":[],"c9":[]},"dT":{"y":["fh"]},"em":{"hP":[]},"e4":{"w":[]},"cI":{"ax":[],"w":[]},"u":{"X":["1"]},"el":{"kU":[]},"cH":{"y":["1"]},"U":{"e":["1"],"e.E":"1"},"an":{"w":[]},"cs":{"e1":["1"]},"cN":{"iQ":[]},"eh":{"cN":[],"iQ":[]},"cx":{"v":["1","2"],"E":["1","2"],"v.K":"1","v.V":"2"},"cy":{"m":["1"],"e":["1"],"e.E":"1"},"cz":{"y":["1"]},"cA":{"bM":["1"],"bc":["1"],"ch":["1"],"m":["1"],"e":["1"]},"aC":{"y":["1"]},"bh":{"bM":["1"],"bc":["1"],"ch":["1"],"m":["1"],"e":["1"]},"bi":{"y":["1"]},"aQ":{"p":["1"],"co":["1"],"x":["1"],"m":["1"],"e":["1"],"p.E":"1"},"p":{"x":["1"],"m":["1"],"e":["1"]},"v":{"E":["1","2"]},"bc":{"ch":["1"],"m":["1"],"e":["1"]},"bM":{"bc":["1"],"ch":["1"],"m":["1"],"e":["1"]},"e9":{"v":["h","@"],"E":["h","@"],"v.K":"h","v.V":"@"},"ea":{"H":["h"],"m":["h"],"e":["h"],"e.E":"h","H.E":"h"},"b0":{"a4":["b0"]},"aI":{"a4":["aI"]},"af":{"ag":[],"a4":["ag"]},"x":{"m":["1"],"e":["1"]},"ag":{"a4":["ag"]},"fh":{"c9":[]},"h":{"a4":["h"],"ff":[]},"bU":{"w":[]},"ax":{"w":[]},"a3":{"w":[]},"cc":{"w":[]},"dp":{"w":[]},"cp":{"w":[]},"dP":{"w":[]},"ck":{"w":[]},"de":{"w":[]},"dz":{"w":[]},"cj":{"w":[]},"ej":{"aO":[]},"as":{"b":[]},"i":{"q":[]},"S":{"d":[],"a":[],"i":[],"q":[]},"d":{"a":[],"i":[],"q":[]},"d1":{"d":[],"a":[],"i":[],"q":[]},"d3":{"d":[],"a":[],"i":[],"q":[]},"bm":{"d":[],"a":[],"i":[],"q":[]},"aX":{"d":[],"a":[],"i":[],"q":[]},"aZ":{"i":[],"q":[]},"bo":{"i":[],"q":[]},"b1":{"i":[],"q":[]},"cw":{"p":["1"],"x":["1"],"m":["1"],"e":["1"],"p.E":"1"},"a":{"i":[],"q":[]},"dm":{"p":["W"],"Y":["W"],"x":["W"],"bt":["W"],"m":["W"],"e":["W"],"p.E":"W","Y.E":"W"},"dn":{"d":[],"a":[],"i":[],"q":[]},"c1":{"i":[],"q":[]},"bq":{"d":[],"a":[],"i":[],"q":[]},"bI":{"p":["i"],"x":["i"],"m":["i"],"e":["i"],"p.E":"i"},"bx":{"p":["i"],"Y":["i"],"x":["i"],"bt":["i"],"m":["i"],"e":["i"],"p.E":"i","Y.E":"i"},"bb":{"d":[],"a":[],"i":[],"q":[]},"bC":{"d":[],"a":[],"i":[],"q":[]},"aP":{"i":[],"q":[]},"bD":{"d":[],"a":[],"i":[],"q":[]},"T":{"b":[]},"cr":{"fy":[],"q":[]},"bH":{"i":[],"q":[]},"cE":{"p":["i"],"Y":["i"],"x":["i"],"bt":["i"],"m":["i"],"e":["i"],"p.E":"i","Y.E":"i"},"dY":{"v":["h","h"],"E":["h","h"]},"bf":{"v":["h","h"],"E":["h","h"],"v.K":"h","v.V":"h"},"bg":{"cm":["1"]},"bJ":{"bg":["1"],"cm":["1"]},"cv":{"kR":["1"]},"fV":{"b9":[]},"fa":{"b9":[]},"b3":{"y":["1"]},"e3":{"fy":[],"q":[]},"ep":{"kx":[]},"dR":{"b":[]},"d7":{"d2":[]},"ai":{"ce":[]},"dD":{"ai":[],"ce":[]},"ba":{"bd":[],"B":[]},"cd":{"B":[]},"dC":{"a_":[],"k":[],"Q":[]},"d0":{"b9":[]},"dS":{"k7":[]},"eq":{"hB":[]},"ec":{"hB":[]},"en":{"iP":[]},"aD":{"iP":[]},"dZ":{"dJ":[]},"ll":{"G":[],"aN":[],"B":[]},"k":{"Q":[]},"hF":{"k":[],"Q":[]},"ab":{"b6":[]},"kA":{"k":[],"Q":[]},"a7":{"B":[]},"bV":{"k":[],"Q":[]},"eg":{"aN":[],"B":[]},"cF":{"a_":[],"k":[],"Q":[]},"G":{"aN":[],"B":[]},"dh":{"a_":[],"k":[],"Q":[]},"C":{"B":[]},"dN":{"a_":[],"k":[],"Q":[]},"dy":{"b6":[]},"bG":{"b6":[]},"aN":{"B":[]},"bz":{"k":[],"Q":[]},"c5":{"k":[],"Q":[]},"bW":{"a_":[],"k":[],"Q":[]},"cb":{"a_":[],"k":[],"Q":[]},"c6":{"a_":[],"k":[],"Q":[]},"cl":{"k":[],"Q":[]},"bd":{"B":[]},"dG":{"k":[],"Q":[]},"dk":{"bd":[],"B":[]},"ap":{"a7":[],"B":[]},"dl":{"J":["ap"],"J.T":"ap"},"bv":{"a7":[],"B":[]},"bw":{"J":["bv"],"J.T":"bv"},"bB":{"a7":[],"B":[]},"ci":{"J":["bB"],"J.T":"bB"},"bE":{"a7":[],"B":[]},"dO":{"J":["bE"],"J.T":"bE"},"b_":{"a7":[],"B":[]},"e0":{"dL":["b_","E"],"J":["b_"],"J.T":"b_"}}')) +A.lh(v.typeUniverse,JSON.parse('{"bF":1,"cO":2,"db":2,"df":2,"dK":1}')) +var u={c:"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type"} +var t=(function rtii(){var s=A.cX +return{n:s("an"),cR:s("bm"),f:s("aX"),fR:s("bo"),e8:s("a4<@>"),m:s("B"),dy:s("b0"),J:s("G"),fu:s("aI"),gw:s("m<@>"),h:s("a"),I:s("k"),C:s("w"),B:s("b"),U:s("b2"),c8:s("W"),Z:s("b4"),b9:s("X<@>"),cX:s("ab"),dW:s("ab"),r:s("ab>"),ar:s("hF"),p:s("bq"),u:s("t"),cU:s("e"),hf:s("e<@>"),i:s("z"),k:s("z"),e:s("z"),ej:s("z"),s:s("z"),b:s("z<@>"),bT:s("z<~()>"),T:s("c4"),V:s("aq"),aU:s("bt<@>"),et:s("b6"),G:s("as"),er:s("x"),am:s("x"),eN:s("x"),W:s("x"),j:s("x<@>"),fK:s("a5"),d1:s("E"),eO:s("E<@,@>"),A:s("i"),f6:s("b9"),P:s("I"),K:s("o"),w:s("S"),E:s("aN"),Y:s("cd"),gT:s("mM"),bQ:s("+()"),cz:s("fh"),X:s("a_"),d2:s("bb"),l:s("aO"),D:s("a7"),q:s("bd"),N:s("h"),gQ:s("h(c9)"),aW:s("bC"),x:s("aP"),cJ:s("bD"),t:s("C"),g9:s("ad"),dm:s("aw"),dd:s("hP"),eK:s("ax"),ak:s("be"),ep:s("aQ"),gj:s("bG"),dj:s("aA"),ci:s("fy"),h9:s("bH"),ac:s("bI"),cl:s("bJ"),cw:s("bg"),gJ:s("cw"),c:s("u<@>"),fJ:s("u"),cd:s("u<~>"),d:s("U"),y:s("O"),cm:s("O(t)"),al:s("O(o)"),gR:s("ew"),z:s("@"),O:s("@()"),v:s("@(o)"),R:s("@(o,aO)"),S:s("af"),aw:s("0&*"),_:s("o*"),b4:s("k?"),ch:s("q?"),eH:s("X?"),dg:s("d?"),d5:s("x?"),gV:s("x?"),bM:s("x<@>?"),gP:s("E?"),cZ:s("E?"),fY:s("E?"),dn:s("E?"),gh:s("i?"),cK:s("o?"),dZ:s("ch?"),dl:s("ch?"),gf:s("J?"),ey:s("h(c9)?"),F:s("aB<@,@>?"),g:s("eb?"),o:s("@(b)?"),a:s("~()?"),c9:s("~(as)?"),di:s("ag"),H:s("~"),M:s("~()"),L:s("~(k)"),Q:s("~(b)"),eA:s("~(h,h)"),cA:s("~(h,@)")}})();(function constants(){var s=hunkHelpers.makeConstList +B.x=A.aX.prototype +B.I=A.di.prototype +B.L=A.c1.prototype +B.a1=J.c2.prototype +B.a=J.z.prototype +B.c=J.c3.prototype +B.h=J.br.prototype +B.d=J.aK.prototype +B.a2=J.aq.prototype +B.a3=J.Z.prototype +B.a8=A.bx.prototype +B.u=J.dA.prototype +B.ac=A.bb.prototype +B.k=J.be.prototype +B.ai=new A.eA("solid") +B.l=function getTagFallback(o) { + var s = Object.prototype.toString.call(o); + return s.substring(8, s.length - 1); +} +B.y=function() { + var toStringFunction = Object.prototype.toString; + function getTag(o) { + var s = toStringFunction.call(o); + return s.substring(8, s.length - 1); + } + function getUnknownTag(object, tag) { + if (/^HTML[A-Z].*Element$/.test(tag)) { + var name = toStringFunction.call(object); + if (name == "[object Object]") return null; + return "HTMLElement"; + } + } + function getUnknownTagGenericBrowser(object, tag) { + if (object instanceof HTMLElement) return "HTMLElement"; + return getUnknownTag(object, tag); + } + function prototypeForTag(tag) { + if (typeof window == "undefined") return null; + if (typeof window[tag] == "undefined") return null; + var constructor = window[tag]; + if (typeof constructor != "function") return null; + return constructor.prototype; + } + function discriminator(tag) { return null; } + var isBrowser = typeof HTMLElement == "function"; + return { + getTag: getTag, + getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag, + prototypeForTag: prototypeForTag, + discriminator: discriminator }; +} +B.D=function(getTagFallback) { + return function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks; + if (userAgent.indexOf("Chrome") >= 0) { + function confirm(p) { + return typeof window == "object" && window[p] && window[p].name == p; + } + if (confirm("Window") && confirm("HTMLElement")) return hooks; + } + hooks.getTag = getTagFallback; + }; +} +B.z=function(hooks) { + if (typeof dartExperimentalFixupGetTag != "function") return hooks; + hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag); +} +B.C=function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + if (userAgent.indexOf("Firefox") == -1) return hooks; + var getTag = hooks.getTag; + var quickMap = { + "BeforeUnloadEvent": "Event", + "DataTransfer": "Clipboard", + "GeoGeolocation": "Geolocation", + "Location": "!Location", + "WorkerMessageEvent": "MessageEvent", + "XMLDocument": "!Document"}; + function getTagFirefox(o) { + var tag = getTag(o); + return quickMap[tag] || tag; + } + hooks.getTag = getTagFirefox; +} +B.B=function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + if (userAgent.indexOf("Trident/") == -1) return hooks; + var getTag = hooks.getTag; + var quickMap = { + "BeforeUnloadEvent": "Event", + "DataTransfer": "Clipboard", + "HTMLDDElement": "HTMLElement", + "HTMLDTElement": "HTMLElement", + "HTMLPhraseElement": "HTMLElement", + "Position": "Geoposition" + }; + function getTagIE(o) { + var tag = getTag(o); + var newTag = quickMap[tag]; + if (newTag) return newTag; + if (tag == "Object") { + if (window.DataView && (o instanceof window.DataView)) return "DataView"; + } + return tag; + } + function prototypeForTagIE(tag) { + var constructor = window[tag]; + if (constructor == null) return null; + return constructor.prototype; + } + hooks.getTag = getTagIE; + hooks.prototypeForTag = prototypeForTagIE; +} +B.A=function(hooks) { + var getTag = hooks.getTag; + var prototypeForTag = hooks.prototypeForTag; + function getTagFixed(o) { + var tag = getTag(o); + if (tag == "Document") { + if (!!o.xmlVersion) return "!Document"; + return "!HTMLDocument"; + } + return tag; + } + function prototypeForTagFixed(tag) { + if (tag == "Document") return null; + return prototypeForTag(tag); + } + hooks.getTag = getTagFixed; + hooks.prototypeForTag = prototypeForTagFixed; +} +B.m=function(hooks) { return hooks; } + +B.E=new A.eY() +B.F=new A.dz() +B.i=new A.fl() +B.G=new A.ec() +B.b=new A.eh() +B.j=new A.ej() +B.H=new A.b_(null) +B.J=new A.aI(0) +B.K=new A.aI(3e6) +B.n=new A.t("checkbox") +B.o=new A.t("date") +B.p=new A.t("dateTimeLocal") +B.q=new A.t("file") +B.r=new A.t("number") +B.t=new A.t("radio") +B.a4=new A.eZ(null) +B.M=new A.t("button") +B.N=new A.t("color") +B.O=new A.t("email") +B.P=new A.t("hidden") +B.Q=new A.t("image") +B.R=new A.t("month") +B.S=new A.t("password") +B.T=new A.t("range") +B.U=new A.t("reset") +B.V=new A.t("search") +B.W=new A.t("submit") +B.X=new A.t("tel") +B.Y=new A.t("text") +B.Z=new A.t("time") +B.a_=new A.t("url") +B.a0=new A.t("week") +B.a5=A.f(s([B.M,B.n,B.N,B.o,B.p,B.O,B.q,B.P,B.Q,B.R,B.r,B.S,B.t,B.T,B.U,B.V,B.W,B.X,B.Y,B.Z,B.a_,B.a0]),A.cX("z")) +B.a6=A.f(s(["HEAD","AREA","BASE","BASEFONT","BR","COL","COLGROUP","EMBED","FRAME","FRAMESET","HR","IMAGE","IMG","INPUT","ISINDEX","LINK","META","PARAM","SOURCE","STYLE","TITLE","WBR"]),t.s) +B.a9={svg:0,math:1} +B.a7=new A.bZ(B.a9,["http://www.w3.org/2000/svg","http://www.w3.org/1998/Math/MathML"],A.cX("bZ")) +B.v=new A.cg("idle") +B.aa=new A.cg("midFrameCallback") +B.ab=new A.cg("postFrameCallbacks") +B.ad=A.hv("mH") +B.ae=A.hv("o") +B.af=A.hv("h") +B.w=A.hv("ll") +B.e=new A.bK("initial") +B.f=new A.bK("active") +B.ag=new A.bK("inactive") +B.ah=new A.bK("defunct")})();(function staticFields(){$.fX=null +$.a0=A.f([],A.cX("z")) +$.iF=null +$.iq=null +$.ip=null +$.js=null +$.jo=null +$.jz=null +$.hf=null +$.hn=null +$.i7=null +$.n2=A.f([],A.cX("z?>")) +$.bN=null +$.cT=null +$.cU=null +$.i_=!1 +$.r=B.b +$.aJ=null +$.hC=null +$.iv=null +$.iW=A.aj(t.N,t.Z) +$.dd=A.aj(t.r,t.I) +$.M=1})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal +s($,"mA","jC",()=>A.mc("_$dart_dartClosure")) +s($,"ng","hw",()=>B.b.cg(new A.hq(),A.cX("X<~>"))) +s($,"mP","jH",()=>A.ay(A.fx({ +toString:function(){return"$receiver$"}}))) +s($,"mQ","jI",()=>A.ay(A.fx({$method$:null, +toString:function(){return"$receiver$"}}))) +s($,"mR","jJ",()=>A.ay(A.fx(null))) +s($,"mS","jK",()=>A.ay(function(){var $argumentsExpr$="$arguments$" +try{null.$method$($argumentsExpr$)}catch(r){return r.message}}())) +s($,"mV","jN",()=>A.ay(A.fx(void 0))) +s($,"mW","jO",()=>A.ay(function(){var $argumentsExpr$="$arguments$" +try{(void 0).$method$($argumentsExpr$)}catch(r){return r.message}}())) +s($,"mU","jM",()=>A.ay(A.iN(null))) +s($,"mT","jL",()=>A.ay(function(){try{null.$method$}catch(r){return r.message}}())) +s($,"mY","jQ",()=>A.ay(A.iN(void 0))) +s($,"mX","jP",()=>A.ay(function(){try{(void 0).$method$}catch(r){return r.message}}())) +s($,"n_","id",()=>A.kW()) +s($,"mG","jG",()=>$.hw()) +s($,"nc","ex",()=>A.jw(B.ae)) +s($,"mE","jF",()=>{var r=t.N +return A.dw(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],r,r)}) +s($,"n1","jR",()=>A.hK(["A","ABBR","ACRONYM","ADDRESS","AREA","ARTICLE","ASIDE","AUDIO","B","BDI","BDO","BIG","BLOCKQUOTE","BR","BUTTON","CANVAS","CAPTION","CENTER","CITE","CODE","COL","COLGROUP","COMMAND","DATA","DATALIST","DD","DEL","DETAILS","DFN","DIR","DIV","DL","DT","EM","FIELDSET","FIGCAPTION","FIGURE","FONT","FOOTER","FORM","H1","H2","H3","H4","H5","H6","HEADER","HGROUP","HR","I","IFRAME","IMG","INPUT","INS","KBD","LABEL","LEGEND","LI","MAP","MARK","MENU","METER","NAV","NOBR","OL","OPTGROUP","OPTION","OUTPUT","P","PRE","PROGRESS","Q","S","SAMP","SECTION","SELECT","SMALL","SOURCE","SPAN","STRIKE","STRONG","SUB","SUMMARY","SUP","TABLE","TBODY","TD","TEXTAREA","TFOOT","TH","THEAD","TIME","TR","TRACK","TT","U","UL","VAR","VIDEO","WBR"],t.N)) +s($,"mB","jD",()=>B.d.c7(A.iu(),"Opera",0)) +s($,"mC","jE",()=>!$.jD()&&B.d.c7(A.iu(),"WebKit",0)) +s($,"nd","jT",()=>A.iI("^\\$\\s=(.*)$")) +s($,"nb","jS",()=>A.iI("&(amp|lt|gt);"))})();(function nativeSupport(){!function(){var s=function(a){var m={} +m[a]=1 +return Object.keys(hunkHelpers.convertToFastObject(m))[0]} +v.getIsolateTag=function(a){return s("___dart_"+a+v.isolateTag)} +var r="___dart_isolate_tags_" +var q=Object[r]||(Object[r]=Object.create(null)) +var p="_ZxYxX" +for(var o=0;;o++){var n=s(p+"_"+o+"_") +if(!(n in q)){q[n]=1 +v.isolateTag=n +break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() +hunkHelpers.setOrUpdateInterceptorsByTag({DOMError:J.Z,MediaError:J.Z,Navigator:J.Z,NavigatorConcurrentHardware:J.Z,NavigatorUserMediaError:J.Z,OverconstrainedError:J.Z,PositionError:J.Z,GeolocationPositionError:J.Z,Range:J.Z,HTMLAudioElement:A.d,HTMLBRElement:A.d,HTMLButtonElement:A.d,HTMLCanvasElement:A.d,HTMLContentElement:A.d,HTMLDListElement:A.d,HTMLDataElement:A.d,HTMLDataListElement:A.d,HTMLDetailsElement:A.d,HTMLDialogElement:A.d,HTMLDivElement:A.d,HTMLEmbedElement:A.d,HTMLFieldSetElement:A.d,HTMLHRElement:A.d,HTMLHeadElement:A.d,HTMLHeadingElement:A.d,HTMLHtmlElement:A.d,HTMLIFrameElement:A.d,HTMLImageElement:A.d,HTMLLIElement:A.d,HTMLLabelElement:A.d,HTMLLegendElement:A.d,HTMLLinkElement:A.d,HTMLMapElement:A.d,HTMLMediaElement:A.d,HTMLMenuElement:A.d,HTMLMetaElement:A.d,HTMLMeterElement:A.d,HTMLModElement:A.d,HTMLOListElement:A.d,HTMLObjectElement:A.d,HTMLOptGroupElement:A.d,HTMLOutputElement:A.d,HTMLParagraphElement:A.d,HTMLParamElement:A.d,HTMLPictureElement:A.d,HTMLPreElement:A.d,HTMLProgressElement:A.d,HTMLQuoteElement:A.d,HTMLScriptElement:A.d,HTMLShadowElement:A.d,HTMLSlotElement:A.d,HTMLSourceElement:A.d,HTMLSpanElement:A.d,HTMLStyleElement:A.d,HTMLTableCaptionElement:A.d,HTMLTableCellElement:A.d,HTMLTableDataCellElement:A.d,HTMLTableHeaderCellElement:A.d,HTMLTableColElement:A.d,HTMLTableElement:A.d,HTMLTableRowElement:A.d,HTMLTableSectionElement:A.d,HTMLTimeElement:A.d,HTMLTitleElement:A.d,HTMLTrackElement:A.d,HTMLUListElement:A.d,HTMLUnknownElement:A.d,HTMLVideoElement:A.d,HTMLDirectoryElement:A.d,HTMLFontElement:A.d,HTMLFrameElement:A.d,HTMLFrameSetElement:A.d,HTMLMarqueeElement:A.d,HTMLElement:A.d,HTMLAnchorElement:A.d1,HTMLAreaElement:A.d3,HTMLBaseElement:A.bm,Blob:A.d5,HTMLBodyElement:A.aX,ProcessingInstruction:A.aZ,CharacterData:A.aZ,Comment:A.bo,XMLDocument:A.b1,Document:A.b1,DOMException:A.eC,DOMImplementation:A.di,MathMLElement:A.a,SVGAElement:A.a,SVGAnimateElement:A.a,SVGAnimateMotionElement:A.a,SVGAnimateTransformElement:A.a,SVGAnimationElement:A.a,SVGCircleElement:A.a,SVGClipPathElement:A.a,SVGDefsElement:A.a,SVGDescElement:A.a,SVGDiscardElement:A.a,SVGEllipseElement:A.a,SVGFEBlendElement:A.a,SVGFEColorMatrixElement:A.a,SVGFEComponentTransferElement:A.a,SVGFECompositeElement:A.a,SVGFEConvolveMatrixElement:A.a,SVGFEDiffuseLightingElement:A.a,SVGFEDisplacementMapElement:A.a,SVGFEDistantLightElement:A.a,SVGFEFloodElement:A.a,SVGFEFuncAElement:A.a,SVGFEFuncBElement:A.a,SVGFEFuncGElement:A.a,SVGFEFuncRElement:A.a,SVGFEGaussianBlurElement:A.a,SVGFEImageElement:A.a,SVGFEMergeElement:A.a,SVGFEMergeNodeElement:A.a,SVGFEMorphologyElement:A.a,SVGFEOffsetElement:A.a,SVGFEPointLightElement:A.a,SVGFESpecularLightingElement:A.a,SVGFESpotLightElement:A.a,SVGFETileElement:A.a,SVGFETurbulenceElement:A.a,SVGFilterElement:A.a,SVGForeignObjectElement:A.a,SVGGElement:A.a,SVGGeometryElement:A.a,SVGGraphicsElement:A.a,SVGImageElement:A.a,SVGLineElement:A.a,SVGLinearGradientElement:A.a,SVGMarkerElement:A.a,SVGMaskElement:A.a,SVGMetadataElement:A.a,SVGPathElement:A.a,SVGPatternElement:A.a,SVGPolygonElement:A.a,SVGPolylineElement:A.a,SVGRadialGradientElement:A.a,SVGRectElement:A.a,SVGScriptElement:A.a,SVGSetElement:A.a,SVGStopElement:A.a,SVGStyleElement:A.a,SVGElement:A.a,SVGSVGElement:A.a,SVGSwitchElement:A.a,SVGSymbolElement:A.a,SVGTSpanElement:A.a,SVGTextContentElement:A.a,SVGTextElement:A.a,SVGTextPathElement:A.a,SVGTextPositioningElement:A.a,SVGTitleElement:A.a,SVGUseElement:A.a,SVGViewElement:A.a,SVGGradientElement:A.a,SVGComponentTransferFunctionElement:A.a,SVGFEDropShadowElement:A.a,SVGMPathElement:A.a,Element:A.a,AbortPaymentEvent:A.b,AnimationEvent:A.b,AnimationPlaybackEvent:A.b,ApplicationCacheErrorEvent:A.b,BackgroundFetchClickEvent:A.b,BackgroundFetchEvent:A.b,BackgroundFetchFailEvent:A.b,BackgroundFetchedEvent:A.b,BeforeInstallPromptEvent:A.b,BeforeUnloadEvent:A.b,BlobEvent:A.b,CanMakePaymentEvent:A.b,ClipboardEvent:A.b,CloseEvent:A.b,CustomEvent:A.b,DeviceMotionEvent:A.b,DeviceOrientationEvent:A.b,ErrorEvent:A.b,ExtendableEvent:A.b,ExtendableMessageEvent:A.b,FetchEvent:A.b,FontFaceSetLoadEvent:A.b,ForeignFetchEvent:A.b,GamepadEvent:A.b,HashChangeEvent:A.b,InstallEvent:A.b,MediaEncryptedEvent:A.b,MediaKeyMessageEvent:A.b,MediaQueryListEvent:A.b,MediaStreamEvent:A.b,MediaStreamTrackEvent:A.b,MessageEvent:A.b,MIDIConnectionEvent:A.b,MIDIMessageEvent:A.b,MutationEvent:A.b,NotificationEvent:A.b,PageTransitionEvent:A.b,PaymentRequestEvent:A.b,PaymentRequestUpdateEvent:A.b,PopStateEvent:A.b,PresentationConnectionAvailableEvent:A.b,PresentationConnectionCloseEvent:A.b,ProgressEvent:A.b,PromiseRejectionEvent:A.b,PushEvent:A.b,RTCDataChannelEvent:A.b,RTCDTMFToneChangeEvent:A.b,RTCPeerConnectionIceEvent:A.b,RTCTrackEvent:A.b,SecurityPolicyViolationEvent:A.b,SensorErrorEvent:A.b,SpeechRecognitionError:A.b,SpeechRecognitionEvent:A.b,SpeechSynthesisEvent:A.b,StorageEvent:A.b,SyncEvent:A.b,TrackEvent:A.b,TransitionEvent:A.b,WebKitTransitionEvent:A.b,VRDeviceEvent:A.b,VRDisplayEvent:A.b,VRSessionEvent:A.b,MojoInterfaceRequestEvent:A.b,ResourceProgressEvent:A.b,USBConnectionEvent:A.b,AudioProcessingEvent:A.b,OfflineAudioCompletionEvent:A.b,WebGLContextEvent:A.b,Event:A.b,InputEvent:A.b,SubmitEvent:A.b,Clipboard:A.q,IDBOpenDBRequest:A.q,IDBVersionChangeRequest:A.q,IDBRequest:A.q,EventTarget:A.q,File:A.W,FileList:A.dm,HTMLFormElement:A.dn,HTMLDocument:A.c1,HTMLInputElement:A.bq,KeyboardEvent:A.as,Location:A.f0,DocumentFragment:A.i,ShadowRoot:A.i,DocumentType:A.i,Node:A.i,NodeList:A.bx,RadioNodeList:A.bx,HTMLOptionElement:A.S,HTMLSelectElement:A.bb,HTMLTemplateElement:A.bC,CDATASection:A.aP,Text:A.aP,HTMLTextAreaElement:A.bD,CompositionEvent:A.T,FocusEvent:A.T,MouseEvent:A.T,DragEvent:A.T,PointerEvent:A.T,TextEvent:A.T,TouchEvent:A.T,WheelEvent:A.T,UIEvent:A.T,Window:A.cr,DOMWindow:A.cr,Attr:A.bH,NamedNodeMap:A.cE,MozNamedAttrMap:A.cE,IDBVersionChangeEvent:A.dR}) +hunkHelpers.setOrUpdateLeafTags({DOMError:true,MediaError:true,Navigator:true,NavigatorConcurrentHardware:true,NavigatorUserMediaError:true,OverconstrainedError:true,PositionError:true,GeolocationPositionError:true,Range:true,HTMLAudioElement:true,HTMLBRElement:true,HTMLButtonElement:true,HTMLCanvasElement:true,HTMLContentElement:true,HTMLDListElement:true,HTMLDataElement:true,HTMLDataListElement:true,HTMLDetailsElement:true,HTMLDialogElement:true,HTMLDivElement:true,HTMLEmbedElement:true,HTMLFieldSetElement:true,HTMLHRElement:true,HTMLHeadElement:true,HTMLHeadingElement:true,HTMLHtmlElement:true,HTMLIFrameElement:true,HTMLImageElement:true,HTMLLIElement:true,HTMLLabelElement:true,HTMLLegendElement:true,HTMLLinkElement:true,HTMLMapElement:true,HTMLMediaElement:true,HTMLMenuElement:true,HTMLMetaElement:true,HTMLMeterElement:true,HTMLModElement:true,HTMLOListElement:true,HTMLObjectElement:true,HTMLOptGroupElement:true,HTMLOutputElement:true,HTMLParagraphElement:true,HTMLParamElement:true,HTMLPictureElement:true,HTMLPreElement:true,HTMLProgressElement:true,HTMLQuoteElement:true,HTMLScriptElement:true,HTMLShadowElement:true,HTMLSlotElement:true,HTMLSourceElement:true,HTMLSpanElement:true,HTMLStyleElement:true,HTMLTableCaptionElement:true,HTMLTableCellElement:true,HTMLTableDataCellElement:true,HTMLTableHeaderCellElement:true,HTMLTableColElement:true,HTMLTableElement:true,HTMLTableRowElement:true,HTMLTableSectionElement:true,HTMLTimeElement:true,HTMLTitleElement:true,HTMLTrackElement:true,HTMLUListElement:true,HTMLUnknownElement:true,HTMLVideoElement:true,HTMLDirectoryElement:true,HTMLFontElement:true,HTMLFrameElement:true,HTMLFrameSetElement:true,HTMLMarqueeElement:true,HTMLElement:false,HTMLAnchorElement:true,HTMLAreaElement:true,HTMLBaseElement:true,Blob:false,HTMLBodyElement:true,ProcessingInstruction:true,CharacterData:false,Comment:true,XMLDocument:true,Document:false,DOMException:true,DOMImplementation:true,MathMLElement:true,SVGAElement:true,SVGAnimateElement:true,SVGAnimateMotionElement:true,SVGAnimateTransformElement:true,SVGAnimationElement:true,SVGCircleElement:true,SVGClipPathElement:true,SVGDefsElement:true,SVGDescElement:true,SVGDiscardElement:true,SVGEllipseElement:true,SVGFEBlendElement:true,SVGFEColorMatrixElement:true,SVGFEComponentTransferElement:true,SVGFECompositeElement:true,SVGFEConvolveMatrixElement:true,SVGFEDiffuseLightingElement:true,SVGFEDisplacementMapElement:true,SVGFEDistantLightElement:true,SVGFEFloodElement:true,SVGFEFuncAElement:true,SVGFEFuncBElement:true,SVGFEFuncGElement:true,SVGFEFuncRElement:true,SVGFEGaussianBlurElement:true,SVGFEImageElement:true,SVGFEMergeElement:true,SVGFEMergeNodeElement:true,SVGFEMorphologyElement:true,SVGFEOffsetElement:true,SVGFEPointLightElement:true,SVGFESpecularLightingElement:true,SVGFESpotLightElement:true,SVGFETileElement:true,SVGFETurbulenceElement:true,SVGFilterElement:true,SVGForeignObjectElement:true,SVGGElement:true,SVGGeometryElement:true,SVGGraphicsElement:true,SVGImageElement:true,SVGLineElement:true,SVGLinearGradientElement:true,SVGMarkerElement:true,SVGMaskElement:true,SVGMetadataElement:true,SVGPathElement:true,SVGPatternElement:true,SVGPolygonElement:true,SVGPolylineElement:true,SVGRadialGradientElement:true,SVGRectElement:true,SVGScriptElement:true,SVGSetElement:true,SVGStopElement:true,SVGStyleElement:true,SVGElement:true,SVGSVGElement:true,SVGSwitchElement:true,SVGSymbolElement:true,SVGTSpanElement:true,SVGTextContentElement:true,SVGTextElement:true,SVGTextPathElement:true,SVGTextPositioningElement:true,SVGTitleElement:true,SVGUseElement:true,SVGViewElement:true,SVGGradientElement:true,SVGComponentTransferFunctionElement:true,SVGFEDropShadowElement:true,SVGMPathElement:true,Element:false,AbortPaymentEvent:true,AnimationEvent:true,AnimationPlaybackEvent:true,ApplicationCacheErrorEvent:true,BackgroundFetchClickEvent:true,BackgroundFetchEvent:true,BackgroundFetchFailEvent:true,BackgroundFetchedEvent:true,BeforeInstallPromptEvent:true,BeforeUnloadEvent:true,BlobEvent:true,CanMakePaymentEvent:true,ClipboardEvent:true,CloseEvent:true,CustomEvent:true,DeviceMotionEvent:true,DeviceOrientationEvent:true,ErrorEvent:true,ExtendableEvent:true,ExtendableMessageEvent:true,FetchEvent:true,FontFaceSetLoadEvent:true,ForeignFetchEvent:true,GamepadEvent:true,HashChangeEvent:true,InstallEvent:true,MediaEncryptedEvent:true,MediaKeyMessageEvent:true,MediaQueryListEvent:true,MediaStreamEvent:true,MediaStreamTrackEvent:true,MessageEvent:true,MIDIConnectionEvent:true,MIDIMessageEvent:true,MutationEvent:true,NotificationEvent:true,PageTransitionEvent:true,PaymentRequestEvent:true,PaymentRequestUpdateEvent:true,PopStateEvent:true,PresentationConnectionAvailableEvent:true,PresentationConnectionCloseEvent:true,ProgressEvent:true,PromiseRejectionEvent:true,PushEvent:true,RTCDataChannelEvent:true,RTCDTMFToneChangeEvent:true,RTCPeerConnectionIceEvent:true,RTCTrackEvent:true,SecurityPolicyViolationEvent:true,SensorErrorEvent:true,SpeechRecognitionError:true,SpeechRecognitionEvent:true,SpeechSynthesisEvent:true,StorageEvent:true,SyncEvent:true,TrackEvent:true,TransitionEvent:true,WebKitTransitionEvent:true,VRDeviceEvent:true,VRDisplayEvent:true,VRSessionEvent:true,MojoInterfaceRequestEvent:true,ResourceProgressEvent:true,USBConnectionEvent:true,AudioProcessingEvent:true,OfflineAudioCompletionEvent:true,WebGLContextEvent:true,Event:false,InputEvent:false,SubmitEvent:false,Clipboard:true,IDBOpenDBRequest:true,IDBVersionChangeRequest:true,IDBRequest:true,EventTarget:false,File:true,FileList:true,HTMLFormElement:true,HTMLDocument:true,HTMLInputElement:true,KeyboardEvent:true,Location:true,DocumentFragment:true,ShadowRoot:true,DocumentType:true,Node:false,NodeList:true,RadioNodeList:true,HTMLOptionElement:true,HTMLSelectElement:true,HTMLTemplateElement:true,CDATASection:true,Text:true,HTMLTextAreaElement:true,CompositionEvent:true,FocusEvent:true,MouseEvent:true,DragEvent:true,PointerEvent:true,TextEvent:true,TouchEvent:true,WheelEvent:true,UIEvent:false,Window:true,DOMWindow:true,Attr:true,NamedNodeMap:true,MozNamedAttrMap:true,IDBVersionChangeEvent:true})})() +Function.prototype.$0=function(){return this()} +Function.prototype.$3=function(a,b,c){return this(a,b,c)} +Function.prototype.$1=function(a){return this(a)} +Function.prototype.$2=function(a,b){return this(a,b)} +Function.prototype.$4=function(a,b,c,d){return this(a,b,c,d)} +Function.prototype.$1$1=function(a){return this(a)} +Function.prototype.$1$0=function(){return this()} +convertAllToFastObject(w) +convertToFastObject($);(function(a){if(typeof document==="undefined"){a(null) +return}if(typeof document.currentScript!="undefined"){a(document.currentScript) +return}var s=document.scripts +function onLoad(b){for(var q=0;q createState() => _ClientAppState(); +} + +class _ClientAppState extends State + with SyncStateMixin> { + /// The name of the test. + late final String testName; + + /// The name of the test with the hierarchy. + late final String testNameWithHierarchy; + + /// The events that occurred during the test. + late final List timelineEvents; + + @override + void updateState(Map value) { + // This uses Jasprs sync mechanism to retrieve the synced server state from the rendered HTML. + // See ServerApp.getState() where the server injects the data + timelineEvents = (value['timelineEvents'] as List) + .cast>() + .map(TimelineEvent.fromMap) + .toList(); + testName = value['testName'] as String; + testNameWithHierarchy = value['testNameWithHierarchy'] as String; + } + + @override + Map getState() { + throw UnimplementedError("Not implemented for client app"); + } + + @override + Iterable build(BuildContext context) sync* { + yield TimelineApp( + testName: testName, + testNameWithHierarchy: testNameWithHierarchy, + timelineEvents: timelineEvents, + ); + } +} diff --git a/lib/src/timeline/html/web/server_app.dart b/lib/src/timeline/html/web/server_app.dart new file mode 100644 index 00000000..a665ba5e --- /dev/null +++ b/lib/src/timeline/html/web/server_app.dart @@ -0,0 +1,74 @@ +// ignore_for_file: public_member_api_docs + +import 'package:jaspr/jaspr.dart'; +import 'package:spot/src/timeline/html/components/timeline_app.dart'; +import 'package:spot/src/timeline/html/web/theme.dart'; +import 'package:spot/src/timeline/html/web/timeline_event.dart'; + +/// The main entry point for the timeline web app. +class ServerApp extends StatefulComponent { + const ServerApp({ + required this.testName, + required this.testNameWithHierarchy, + required this.timelineEvents, + super.key, + }); + + /// The name of the test. + final String testName; + + /// The name of the test with the hierarchy. + final String testNameWithHierarchy; + + /// The events that occurred during the test. + final List timelineEvents; + + @override + State createState() => ServerAppState(); +} + +class ServerAppState extends State + with SyncStateMixin> { + @override + Map getState() { + // This uses Jasprs sync mechanism to embed the server state into the rendered HTML. + return { + 'testName': component.testName, + 'testNameWithHierarchy': component.testNameWithHierarchy, + 'timelineEvents': component.timelineEvents.map((e) => e.toMap()).toList(), + }; + } + + @override + void updateState(Map value) { + // See ClientApp.updateState() for the client side implementation. + throw UnimplementedError("Not implemented for server app"); + } + + @override + Iterable build(BuildContext context) sync* { + // Keep in sync with ClientApp.build(). Both should render the same components or hydration changes the DOM. + yield TimelineApp( + testName: component.testName, + testNameWithHierarchy: component.testNameWithHierarchy, + timelineEvents: component.timelineEvents, + ); + } + + static List get styles => [ + css('*') + .text(fontFamily: fontFamily) + .background(color: spotBackground) + .raw({'-webkit-font-smoothing': 'antialiased'}), + css('body').box( + margin: EdgeInsets.all(10.px), + padding: EdgeInsets.only(bottom: 50.px), + ), + css('h1, h2, h3, p, pre').text(color: fontColor), + css('h1') + .text(fontWeight: FontWeight.w400, fontSize: h1FontSize) + .box(padding: h1Padding), + css('.header').flexbox(alignItems: AlignItems.center), + ...TimelineAppState.styles, + ]; +} diff --git a/lib/src/timeline/html/web/theme.dart b/lib/src/timeline/html/web/theme.dart new file mode 100644 index 00000000..179d801f --- /dev/null +++ b/lib/src/timeline/html/web/theme.dart @@ -0,0 +1,97 @@ +// ignore_for_file: public_member_api_docs + +import 'package:jaspr/jaspr.dart'; + +// Colors + +const Color spotGrey = Color.hex('#4a4a4a'); +const Color spotGreen = Color.hex('#557783'); +const Color spotBackground = Color.hex('#F0FCFF'); +const Color spotOrange = Color.hex('#C97B2D'); + +// Typography + +const FontFamily fontFamily = FontFamily.list([ + FontFamily('Google Sans Text'), + FontFamily('Google Sans'), + FontFamily('Roboto'), + FontFamilies.sansSerif, +]); +const Color fontColor = spotGreen; +const Unit h1FontSize = Unit.pixels(36); +const EdgeInsets h1Padding = EdgeInsets.only(left: Unit.pixels(10)); + +// Events + +const Unit eventBoxHeight = Unit.pixels(170); +const Unit thumbnailHeight = Unit.pixels(150); +const Color borderColor = spotOrange; +const EdgeInsets eventMargin = EdgeInsets.all(Unit.pixels(10)); +const EdgeInsets eventPadding = EdgeInsets.all(Unit.pixels(10)); +const EdgeInsets eventDetailsMargin = EdgeInsets.only(left: Unit.pixels(20)); +const EdgeInsets eventDetailsPadding = + EdgeInsets.symmetric(vertical: Unit.pixels(5)); +const Border thumbnailBorder = + Border.all(BorderSide.solid(color: spotGreen, width: Unit.pixels(1))); + +// Modal + +const Color modalBackgroundColor = Color.rgba(0, 0, 0, 0.9); +const Color closeColor = Colors.white; +const Unit closeFontSize = Unit.pixels(40); +const Color closeHoverColor = spotOrange; +const Color navColor = Colors.white; +const Color navBackgroundColor = Colors.transparent; +const Unit navFontSize = Unit.pixels(30); +const Color navHoverColor = spotOrange; +const Color captionColor = Color.hex('#ccc'); +const EdgeInsets captionPadding = + EdgeInsets.symmetric(vertical: Unit.pixels(10)); + +// Button + +const Color buttonBackgroundColor = spotGreen; +const Color buttonColor = Colors.white; +const Color buttonHoverBackgroundColor = spotOrange; +const EdgeInsets buttonPadding = EdgeInsets.symmetric( + vertical: Unit.pixels(10), + horizontal: Unit.pixels(20), +); +const Unit buttonFontSize = Unit.pixels(16); +const BorderRadius buttonBorderRadius = BorderRadius.circular(Unit.pixels(5)); + +// Spacer + +const Color horizontalSpacerBorderColor = spotOrange; +const EdgeInsets horizontalSpacerPadding = + EdgeInsets.only(top: Unit.pixels(25)); + +// Snackbar + +const Color snackbarBackgroundColor = spotOrange; +const Color snackbarColor = Colors.white; +const Unit snackbarFontSize = Unit.pixels(17); + +// Animations + +const animationsCSS = ''' +@-webkit-keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@keyframes fadein { + from {bottom: 0; opacity: 0;} + to {bottom: 30px; opacity: 1;} +} + +@-webkit-keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} + +@keyframes fadeout { + from {bottom: 30px; opacity: 1;} + to {bottom: 0; opacity: 0;} +} +'''; diff --git a/lib/src/timeline/html/web/timeline_event.dart b/lib/src/timeline/html/web/timeline_event.dart new file mode 100644 index 00000000..23c468cb --- /dev/null +++ b/lib/src/timeline/html/web/timeline_event.dart @@ -0,0 +1,48 @@ +// ignore_for_file: public_member_api_docs + +/// A web compatible view on the original timeline event. +/// +/// This class is used to display the timeline event in the HTML file. +class TimelineEvent { + TimelineEvent({ + required this.eventType, + required this.color, + required this.screenshotUrl, + required this.details, + required this.timestamp, + required this.caller, + required this.jetBrainsLink, + }); + + final String eventType; + final int? color; + final String? screenshotUrl; + final String details; + final String timestamp; + final String caller; + final String? jetBrainsLink; + + Map toMap() { + return { + 'eventType': eventType, + 'color': color, + 'screenshotUrl': screenshotUrl, + 'details': details, + 'timestamp': timestamp, + 'caller': caller, + 'jetBrainsLink': jetBrainsLink, + }; + } + + factory TimelineEvent.fromMap(Map map) { + return TimelineEvent( + eventType: map['eventType'] as String, + color: map['color'] as int?, + screenshotUrl: map['screenshotUrl'] as String, + details: map['details'] as String, + timestamp: map['timestamp'] as String, + caller: map['caller'] as String, + jetBrainsLink: map['jetBrainsLink'] as String?, + ); + } +} diff --git a/lib/src/timeline/html/web/web_stubs.dart b/lib/src/timeline/html/web/web_stubs.dart new file mode 100644 index 00000000..5c2da7d5 --- /dev/null +++ b/lib/src/timeline/html/web/web_stubs.dart @@ -0,0 +1,5 @@ +/// Stub for the `window` object from dart:html. +external dynamic window; + +/// Stub for the `HtmlElement` type from dart:html. +typedef HtmlElement = dynamic; diff --git a/lib/src/timeline/timeline.dart b/lib/src/timeline/timeline.dart index 8a4f0a7f..c413097d 100644 --- a/lib/src/timeline/timeline.dart +++ b/lib/src/timeline/timeline.dart @@ -199,7 +199,7 @@ class Timeline { printToConsole(); } // best for humans - printHTML(); + await printHTML(); } } @@ -208,7 +208,7 @@ class Timeline { // during live mode the events are written directly to the console. // Finalize with html report await processPendingScreenshots(); - printHTML(); + await printHTML(); case TimelineMode.always: // ignore: avoid_print print('Generating timeline report'); @@ -218,7 +218,7 @@ class Timeline { printToConsole(); } // best for humans - printHTML(); + await printHTML(); // ignore: deprecated_member_use_from_same_package case TimelineMode.record: await reportOnError(); diff --git a/pubspec.yaml b/pubspec.yaml index af818458..5c2eebe9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,8 +5,8 @@ repository: https://github.com/passsy/spot issue_tracker: https://github.com/passsy/spot/issues environment: - sdk: '>=3.0.0 <3.999.0' - flutter: '>=3.10.0 <4.0.0' + sdk: ">=3.0.0 <3.999.0" + flutter: ">=3.10.0 <4.0.0" dependencies: checks: ^0.3.0 @@ -19,10 +19,11 @@ dependencies: sdk: flutter integration_test: sdk: flutter + jaspr: ^0.15.1 meta: ^1.8.0 nanoid2: ^2.0.0 stack_trace: ^1.11.0 - test_api: '>=0.5.0 <0.8.0' + test_api: ">=0.5.0 <0.8.0" dev_dependencies: image: ^4.0.0 @@ -32,4 +33,4 @@ dev_dependencies: flutter: assets: - - lib/assets/Roboto-Regular.ttf \ No newline at end of file + - lib/assets/Roboto-Regular.ttf diff --git a/test/act/find_tappable_area_test.dart b/test/act/find_tappable_area_test.dart index 44780705..d9eb23d6 100644 --- a/test/act/find_tappable_area_test.dart +++ b/test/act/find_tappable_area_test.dart @@ -174,6 +174,7 @@ void main() { child: Transform.translate( offset: const Offset(100, 0), child: Container( + // ignore: deprecated_member_use color: Colors.red.withOpacity(0.5), width: 400, height: 400, diff --git a/test/widgets/drag_until_visible_test_widget.dart b/test/widgets/drag_until_visible_test_widget.dart index 7edc1be1..d8f01f3d 100644 --- a/test/widgets/drag_until_visible_test_widget.dart +++ b/test/widgets/drag_until_visible_test_widget.dart @@ -4,6 +4,7 @@ class DragUntilVisibleTestWidget extends StatelessWidget { const DragUntilVisibleTestWidget({super.key}); Color getRandomColor(int index) { + // ignore: deprecated_member_use return Colors.black.withOpacity(1 / (index + 1)); } diff --git a/tool/compile_js.dart b/tool/compile_js.dart new file mode 100644 index 00000000..b88889cb --- /dev/null +++ b/tool/compile_js.dart @@ -0,0 +1,41 @@ +// ignore_for_file: avoid_print + +import 'dart:io'; + +/// Compiles the timeline web app to JavaScript. +void main() { + final outputJsFile = File('build/timeline/script.js'); + if (outputJsFile.existsSync()) { + outputJsFile.deleteSync(); + } + + final dartVersionResult = Process.runSync('dart', ['--version']); + final dartVersion = dartVersionResult.stdout.toString(); + + final result = Process.runSync('dart', [ + 'compile', + 'js', + 'lib/src/timeline/html/web/client_app.dart', + '-O2', + '--output=${outputJsFile.path}', + '--no-source-maps', + ]); + stderr.write(result.stderr); + stdout.write(result.stdout); + + final outputJsContent = outputJsFile.readAsStringSync(); + + final scriptDartContent = "// AUTO GENERATED FILE. DO NOT MODIFY.\n\n" + "/// The script used in the HTML file that is generated for the timeline.\n" + "/// Generate it with `dart run tool/compile_js.dart`\n" + "/// Using $dartVersion\n" + "\n" + "// language=javascript\n" + "const String timelineJS = r'''\n$outputJsContent\n''';\n"; + + File('lib/src/timeline/html/sources/script.js.g.dart') + .writeAsStringSync(scriptDartContent); + outputJsFile.deleteSync(); + File('${outputJsFile.path}.deps').deleteSync(); + print('Generated ${outputJsFile.path}'); +}