Discussion:
[dart-misc] Best library for generating Dart code?
James deBoer
2013-08-20 22:24:00 UTC
Permalink
We are building a tool that will automatically generate Dart code. What is
the best library for generating an AST and producing sane Dart source code?

A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case, we
want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?

Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Dan Grove
2013-08-21 15:50:00 UTC
Permalink
+sigmund-hpIqsD4AKlfQT0dZR+***@public.gmane.org and justinfagnani-hpIqsD4AKlfQT0dZR+***@public.gmane.org, who have both been
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Justin Fagnani
2013-08-21 16:29:19 UTC
Permalink
I used dart2js to parse the code and do AST transformations. Fro outputting
the code I walked the AST, but to re-create files like they were in the
input I had to do a bit of extra bookkeeping on libraries and parts, and
pull out source spans if tokens we're contiguous to grab comments and
whitespace in certain locations.

You could also using a templating library like mustaches if you're purely
generating code, but it won't be much help if you're transforming code.

Cheers,
Justin
Post by Dan Grove
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Peter Ahé
2013-08-21 16:37:11 UTC
Permalink
We added 'BackDoor.compilationUnitsOf(library)' to make it easier to
find compilation units. It's used in this sample:

https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/sdk/lib/_internal/compiler/samples/darttags/darttags.dart

Cheers,
Peter

On Wed, Aug 21, 2013 at 6:29 PM, Justin Fagnani
Post by Justin Fagnani
I used dart2js to parse the code and do AST transformations. Fro outputting
the code I walked the AST, but to re-create files like they were in the
input I had to do a bit of extra bookkeeping on libraries and parts, and
pull out source spans if tokens we're contiguous to grab comments and
whitespace in certain locations.
You could also using a templating library like mustaches if you're purely
generating code, but it won't be much help if you're transforming code.
Cheers,
Justin
Post by Dan Grove
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart
(http://pub.dartlang.org/packages/analyzer_experimental). In this case, we
want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Siggi Cherem
2013-08-21 16:37:32 UTC
Permalink
We've done a bit of codegen in web_ui/polymer. Both creating code from
scratch (for example generating brand new code after interpreting html +
MDV bindings), and modifying code in-place (for example the observable
transform that changes @observable classes to notify changes proactively).

In both cases we decided to work directly on the text instead of
manipulating AST nodes. More specifically, we take code written in Dart,
parse it with analyzer experimental and use the AST to understand the code
and find where we need to inject our changes. Based on the offset positions
that the analyzer gives us, we create a transaction of text edits which we
finally commit to generate the final result (see TextEditTransaction
below).

Here are some links to some of our code and a description of what they do.
I've been refactoring some of this code recently, so I'm mixing here
pointers from new and old code:

- the observable transformer: we recently rewrote the code
transformation for @observable as run standalone barback[1] transformer.
The code can be found in the observe package:
https://github.com/dart-lang/bleeding_edge/blob/master/dart/pkg/observe/lib/transform.dart

- the old web_ui compiler had a lot of code emitters here
https://github.com/dart-lang/web-ui/blob/master/lib/src/emitters.dart.
This code used a code generation helper 'CodePrinter' that helps keep
track of indentation, nesting, and source maps. I've recently refactored
out common parts of that type and named it NestedPrinter in the source-maps
package (more below).

We added to the source_maps package a few handy types that can help
generate and transform code:

- TextEditTransaction in
refactor.dart<https://github.com/dart-lang/bleeding_edge/blob/master/dart/pkg/source_maps/lib/refactor.dart>:
has the logic to help with in-place edits. This type can check that you
don't have conflicts in your edits, which is especially useful if you want
to do more than 1 change in a file and you want to split the logic of those
changes in multiple phases.
- NestedPrinter in
printer.dart<https://github.com/dart-lang/bleeding_edge/blob/master/dart/pkg/source_maps/lib/printer.dart#L98>:
has logic for generating text: append text, new lines, track indentation,
track source map locations, and nest printers (for example so you can
create a printer with the contents of a method, and you want to insert it
inside a printer that generates a class).

Hope you find these useful!
Cheers,
Siggi

[1]: barback is the system that pub will use internally to do codegen and
code transformations before serving or deploying an app.
Post by Dan Grove
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
James deBoer
2013-08-21 18:45:49 UTC
Permalink
Sweet, thanks for the responses. I hope the code we are writing is not
that complicated. Just printing text may be the easiest route.
Post by Siggi Cherem
We've done a bit of codegen in web_ui/polymer. Both creating code from
scratch (for example generating brand new code after interpreting html +
MDV bindings), and modifying code in-place (for example the observable
In both cases we decided to work directly on the text instead of
manipulating AST nodes. More specifically, we take code written in Dart,
parse it with analyzer experimental and use the AST to understand the code
and find where we need to inject our changes. Based on the offset positions
that the analyzer gives us, we create a transaction of text edits which we
finally commit to generate the final result (see TextEditTransaction
below).
Here are some links to some of our code and a description of what they do.
I've been refactoring some of this code recently, so I'm mixing here
- the observable transformer: we recently rewrote the code
https://github.com/dart-lang/bleeding_edge/blob/master/dart/pkg/observe/lib/transform.dart
- the old web_ui compiler had a lot of code emitters here
https://github.com/dart-lang/web-ui/blob/master/lib/src/emitters.dart.
This code used a code generation helper 'CodePrinter' that helps keep
track of indentation, nesting, and source maps. I've recently refactored
out common parts of that type and named it NestedPrinter in the source-maps
package (more below).
We added to the source_maps package a few handy types that can help
has the logic to help with in-place edits. This type can check that you
don't have conflicts in your edits, which is especially useful if you want
to do more than 1 change in a file and you want to split the logic of those
changes in multiple phases.
has logic for generating text: append text, new lines, track indentation,
track source map locations, and nest printers (for example so you can
create a printer with the contents of a method, and you want to insert it
inside a printer that generates a class).
Hope you find these useful!
Cheers,
Siggi
[1]: barback is the system that pub will use internally to do codegen and
code transformations before serving or deploying an app.
Post by Dan Grove
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to
http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Sean Eagan
2013-08-21 21:31:32 UTC
Permalink
I actually just uploaded a codegen pub package yesterday:

pub: http://pub.dartlang.org/packages/codegen
github: https://github.com/seaneagan/codegen

It basically focuses on generating library level stuff (library, part of,
import directives, package: URIs, the files themselves, not classes,
methods, fields, etc.) so far. I'm using it to generate locale data code
for intlx <http://pub.dartlang.org/packages/intlx>,
cldr<http://pub.dartlang.org/packages/cldr>,
and intl <http://pub.dartlang.org/packages/intl>.

Would love to get feedback on it!

Cheers,
Sean Eagan
Post by James deBoer
Sweet, thanks for the responses. I hope the code we are writing is not
that complicated. Just printing text may be the easiest route.
Post by Siggi Cherem
We've done a bit of codegen in web_ui/polymer. Both creating code from
scratch (for example generating brand new code after interpreting html +
MDV bindings), and modifying code in-place (for example the observable
In both cases we decided to work directly on the text instead of
manipulating AST nodes. More specifically, we take code written in Dart,
parse it with analyzer experimental and use the AST to understand the code
and find where we need to inject our changes. Based on the offset positions
that the analyzer gives us, we create a transaction of text edits which we
finally commit to generate the final result (see TextEditTransaction
below).
Here are some links to some of our code and a description of what they
do. I've been refactoring some of this code recently, so I'm mixing here
- the observable transformer: we recently rewrote the code
https://github.com/dart-lang/bleeding_edge/blob/master/dart/pkg/observe/lib/transform.dart
- the old web_ui compiler had a lot of code emitters here
https://github.com/dart-lang/web-ui/blob/master/lib/src/emitters.dart.
This code used a code generation helper 'CodePrinter' that helps keep
track of indentation, nesting, and source maps. I've recently refactored
out common parts of that type and named it NestedPrinter in the source-maps
package (more below).
We added to the source_maps package a few handy types that can help
has the logic to help with in-place edits. This type can check that you
don't have conflicts in your edits, which is especially useful if you want
to do more than 1 change in a file and you want to split the logic of those
changes in multiple phases.
has logic for generating text: append text, new lines, track indentation,
track source map locations, and nest printers (for example so you can
create a printer with the contents of a method, and you want to insert it
inside a printer that generates a class).
Hope you find these useful!
Cheers,
Siggi
[1]: barback is the system that pub will use internally to do codegen and
code transformations before serving or deploying an app.
Post by Dan Grove
working on codegen
Post by James deBoer
We are building a tool that will automatically generate Dart code.
What is the best library for generating an AST and producing sane Dart
source code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this
case, we want to *write* Dart. Is analyzer_experimental still the way to go
or is there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to
http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Erik Grimes
2013-08-21 16:27:58 UTC
Permalink
Hey James!

I haven't found any libraries for this sort of thing, but I've found using
mirrors to analyze the source dart code and mustache4dart templates
(http://pub.dartlang.org/packages/mustache4dart) to generate the resulting
code fairly straightforward. If you need access to more than just source
metadata this approach won't work for you. I particularly like using
templates for the code generation. I find it makes it easy to visualize and
evolve the generated code.

Erik
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Daniel Davidson
2013-08-22 20:04:55 UTC
Permalink
I have a code generation library, maybe similar to Sean Eagan's. The
package is called ebisu and it only focuses on the structure, libraries,
parts, classes, members, enums etc. It provides protect blocks so code can
be regenerated without destroying hand written code. I use it to generate
Dart code, D code (ebisu_dlang) and I started using it to generate Web UI
components - before switch to polymer.

The project is: https://github.com/patefacio/ebisu

To get a feel for it, see this which generates the structure of ebisu using
ebisu:
https://github.com/patefacio/ebisu/blob/master/bin/ebisu.ebisu.dart

Thanks,
Dan
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Günter Zöchbauer
2014-02-25 10:49:55 UTC
Permalink
I'm looking for a way to generate Dart code or AST programmatically.
Did some new things emerge since this discussion took place?
Post by Daniel Davidson
I have a code generation library, maybe similar to Sean Eagan's. The
package is called ebisu and it only focuses on the structure, libraries,
parts, classes, members, enums etc. It provides protect blocks so code can
be regenerated without destroying hand written code. I use it to generate
Dart code, D code (ebisu_dlang) and I started using it to generate Web UI
components - before switch to polymer.
The project is: https://github.com/patefacio/ebisu
To get a feel for it, see this which generates the structure of ebisu
https://github.com/patefacio/ebisu/blob/master/bin/ebisu.ebisu.dart
Thanks,
Dan
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For other discussions, see https://groups.google.com/a/dartlang.org/

For HOWTO questions, visit http://stackoverflow.com/tags/dart

To file a bug report or feature request, go to http://www.dartbug.com/new

To unsubscribe from this group and stop receiving emails from it, send an email to misc+unsubscribe-dYxm/***@public.gmane.org
Panneerselvam V.
2018-10-05 17:19:49 UTC
Permalink
Hi GÌnter Zöchbauer,

I am looking for generating flutter code from scratch, did you find
feasible option for generating dart code? Any lead on this topic will be
very helpful to me. Thanks!!!

On Tuesday, February 25, 2014 at 4:19:55 PM UTC+5:30, GÌnter Zöchbauer
Post by Günter Zöchbauer
I'm looking for a way to generate Dart code or AST programmatically.
Did some new things emerge since this discussion took place?
Post by Daniel Davidson
I have a code generation library, maybe similar to Sean Eagan's. The
package is called ebisu and it only focuses on the structure, libraries,
parts, classes, members, enums etc. It provides protect blocks so code can
be regenerated without destroying hand written code. I use it to generate
Dart code, D code (ebisu_dlang) and I started using it to generate Web UI
components - before switch to polymer.
The project is: https://github.com/patefacio/ebisu
To get a feel for it, see this which generates the structure of ebisu
https://github.com/patefacio/ebisu/blob/master/bin/ebisu.ebisu.dart
Thanks,
Dan
Post by James deBoer
We are building a tool that will automatically generate Dart code. What
is the best library for generating an AST and producing sane Dart source
code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this case,
we want to *write* Dart. Is analyzer_experimental still the way to go or is
there something else out there?
Thanks,
James.
--
For more ways to connect visit https://www.dartlang.org/community
---
You received this message because you are subscribed to the Google Groups "Dart Misc" group.
To unsubscribe from this group and stop receiving emails from it, send an email to misc+***@dartlang.org.
To view this discussion on the web visit https://groups.google.com/a/dartlang.org/d/msgid/misc/3a040618-d27c-4812-8a43-fd64eda7dca6%40dartlang.org.
'Samuel Rawlins' via Dart Misc
2018-10-05 21:32:40 UTC
Permalink
Hi Panneerselvam,

That post is pretty old :) Dart has changed a lot in the last 4.5 years.
Luckily it's only gotten better in the code generation story.

The best resource for you is probably the build_runner
<https://pub.dartlang.org/packages/build_runner> package. It has a great
README. Paired with the build <https://pub.dartlang.org/packages/build>
package, you should be able to do some great code generation.
Post by Panneerselvam V.
Hi GÌnter Zöchbauer,
I am looking for generating flutter code from scratch, did you find
feasible option for generating dart code? Any lead on this topic will be
very helpful to me. Thanks!!!
On Tuesday, February 25, 2014 at 4:19:55 PM UTC+5:30, GÌnter Zöchbauer
Post by Günter Zöchbauer
I'm looking for a way to generate Dart code or AST programmatically.
Did some new things emerge since this discussion took place?
Post by Daniel Davidson
I have a code generation library, maybe similar to Sean Eagan's. The
package is called ebisu and it only focuses on the structure, libraries,
parts, classes, members, enums etc. It provides protect blocks so code can
be regenerated without destroying hand written code. I use it to generate
Dart code, D code (ebisu_dlang) and I started using it to generate Web UI
components - before switch to polymer.
The project is: https://github.com/patefacio/ebisu
To get a feel for it, see this which generates the structure of ebisu
https://github.com/patefacio/ebisu/blob/master/bin/ebisu.ebisu.dart
Thanks,
Dan
Post by James deBoer
We are building a tool that will automatically generate Dart code.
What is the best library for generating an AST and producing sane Dart
source code?
A few months ago we were working on a project that used
analyzer_experimental for reading Dart (
http://pub.dartlang.org/packages/analyzer_experimental). In this
case, we want to *write* Dart. Is analyzer_experimental still the way to go
or is there something else out there?
Thanks,
James.
--
For more ways to connect visit https://www.dartlang.org/community
---
You received this message because you are subscribed to the Google Groups
"Dart Misc" group.
To unsubscribe from this group and stop receiving emails from it, send an
To view this discussion on the web visit
https://groups.google.com/a/dartlang.org/d/msgid/misc/3a040618-d27c-4812-8a43-fd64eda7dca6%40dartlang.org
<https://groups.google.com/a/dartlang.org/d/msgid/misc/3a040618-d27c-4812-8a43-fd64eda7dca6%40dartlang.org?utm_medium=email&utm_source=footer>
.
--
For more ways to connect visit https://www.dartlang.org/community
---
You received this message because you are subscribed to the Google Groups "Dart Misc" group.
To unsubscribe from this group and stop receiving emails from it, send an email to misc+***@dartlang.org.
To view this discussion on the web visit https://groups.google.com/a/dartlang.org/d/msgid/misc/CACshfx1M4O_1VdMrfYZbRQvw3QvOryLCdorDcUK9_JijKSofgg%40mail.gmail.com.
Continue reading on narkive:
Loading...