From 4b8af4939389ef146a37e048ee6e67d79b2562c1 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Mon, 20 Aug 2018 21:39:36 -0400 Subject: [PATCH 001/117] Initial Python Runtime Support --- .flake8 | 5 + packages/jsii-python-runtime/package.json | 32 +++ .../jsii-python-runtime/src/jsii/__init__.py | 0 .../jsii-python-runtime/src/jsii/_utils.py | 27 ++ .../src/jsii/kernel/__init__.py | 92 +++++++ .../src/jsii/kernel/providers/__init__.py | 5 + .../src/jsii/kernel/providers/base.py | 71 ++++++ .../src/jsii/kernel/providers/process.py | 217 +++++++++++++++++ .../src/jsii/kernel/types.py | 230 ++++++++++++++++++ .../jsii-python-runtime/src/jsii/runtime.py | 193 +++++++++++++++ 10 files changed, 872 insertions(+) create mode 100644 .flake8 create mode 100644 packages/jsii-python-runtime/package.json create mode 100644 packages/jsii-python-runtime/src/jsii/__init__.py create mode 100644 packages/jsii-python-runtime/src/jsii/_utils.py create mode 100644 packages/jsii-python-runtime/src/jsii/kernel/__init__.py create mode 100644 packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py create mode 100644 packages/jsii-python-runtime/src/jsii/kernel/providers/base.py create mode 100644 packages/jsii-python-runtime/src/jsii/kernel/providers/process.py create mode 100644 packages/jsii-python-runtime/src/jsii/kernel/types.py create mode 100644 packages/jsii-python-runtime/src/jsii/runtime.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000000..7ea9c48f99 --- /dev/null +++ b/.flake8 @@ -0,0 +1,5 @@ +[flake8] +max-line-length = 88 +exclude = *.egg,*/interfaces.py,node_modules,.state +ignore = W503,E203 +select = E,W,F,N diff --git a/packages/jsii-python-runtime/package.json b/packages/jsii-python-runtime/package.json new file mode 100644 index 0000000000..bce2c58736 --- /dev/null +++ b/packages/jsii-python-runtime/package.json @@ -0,0 +1,32 @@ +{ + "name": "jsii-python-runtime", + "version": "0.0.0", + "description": "Python client for jsii runtime", + "main": "index.js", + "scripts": { + "build": "echo ok", + "prepack": "echo ok", + "test": "echo ok" + }, + "dependencies": { + "jsii-runtime": "^0.6.4" + }, + "repository": { + "type": "git", + "url": "git://github.com/awslabs/jsii" + }, + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com" + }, + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/awslabs/jsii.git" + } +} diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/jsii-python-runtime/src/jsii/_utils.py b/packages/jsii-python-runtime/src/jsii/_utils.py new file mode 100644 index 0000000000..08e69ba035 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/_utils.py @@ -0,0 +1,27 @@ +import functools + +from typing import Any, Mapping, Type + + +class Singleton(type): + + _instances: Mapping[Type[Any], Any] = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + + return cls._instances[cls] + + +def memoized_property(fgetter): + stored = [] + + @functools.wraps(fgetter) + def wrapped(self): + nonlocal stored + if not stored: + stored.append(fgetter(self)) + return stored[0] + + return property(wrapped) diff --git a/packages/jsii-python-runtime/src/jsii/kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/kernel/__init__.py new file mode 100644 index 0000000000..82d489a0e4 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/kernel/__init__.py @@ -0,0 +1,92 @@ +from typing import Any, List, Optional, Type + +import attr + +from jsii._utils import Singleton +from jsii.kernel.providers import BaseKernel, ProcessKernel +from jsii.kernel.types import ( + LoadRequest, + CreateRequest, + DeleteRequest, + GetRequest, + InvokeRequest, + SetRequest, + StaticGetRequest, + StaticInvokeRequest, + StaticSetRequest, + StatsRequest, + ObjRef, +) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class Statistics: + + object_count: int + + +class Kernel(metaclass=Singleton): + + # This class translates between the Pythonic interface for the kernel, and the + # Kernel Provider interface that maps more directly to the JSII Kernel interface. + # It currently only supports the idea of a process kernel provider, however it + # should be possible to move to other providers in the future. + + # TODO: We don't currently have any error handling, but we need to. This should + # probably live at the provider layer though, maybe with something catching + # them at this layer to translate it to something more Pythonic, depending + # on what the provider layer looks like. + + def __init__(self, provider_class: Type[BaseKernel] = ProcessKernel) -> None: + self.provider = provider_class() + + # TODO: Do we want to return anything from this method? Is the return value useful + # to anyone? + def load(self, name: str, version: str, tarball: str) -> None: + self.provider.load(LoadRequest(name=name, version=version, tarball=tarball)) + + # TODO: Can we do protocols in typing? + def create(self, klass: Any) -> ObjRef: + return self.provider.create(CreateRequest(fqn=klass.__jsii_type__)) + + def delete(self, ref: ObjRef) -> None: + self.provider.delete(DeleteRequest(objref=ref)) + + def get(self, ref: ObjRef, property: str) -> Any: + return self.provider.get(GetRequest(objref=ref, property_=property)).value + + def set(self, ref: ObjRef, property: str, value: Any) -> None: + self.provider.set( + SetRequest(objref=ref, property_=property, value=value) + ) + + def sget(self, klass: Any, property: str) -> Any: + return self.provider.sget( + StaticGetRequest(fqn=klass.__jsii_type__, property_=property) + ).value + + def sset(self, klass: Any, property: str, value: Any) -> None: + return self.provider.sset( + StaticSetRequest(fqn=klass.__jsii_type__, property_=property, value=value) + ) + + def invoke(self, ref: ObjRef, method: str, args: Optional[List[Any]] = None) -> Any: + if args is None: + args = [] + + return self.provider.invoke( + InvokeRequest(objref=ref, method=method, args=args) + ).result + + def sinvoke(self, klass: Any, method: str, args: Optional[List[Any]] = None) -> Any: + if args is None: + args = [] + + return self.provider.sinvoke( + StaticInvokeRequest(fqn=klass.__jsii_type__, method=method, args=args) + ).result + + def stats(self): + resp = self.provider.stats(StatsRequest()) + + return Statistics(object_count=resp.objectCount) diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py new file mode 100644 index 0000000000..ba922882f9 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py @@ -0,0 +1,5 @@ +from jsii.kernel.providers.base import BaseKernel +from jsii.kernel.providers.process import ProcessKernel + + +__all__ = ["BaseKernel", "ProcessKernel"] diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/base.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/base.py new file mode 100644 index 0000000000..4fd28cdbb3 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/base.py @@ -0,0 +1,71 @@ +import abc + +from typing import Optional + +from jsii.kernel.types import ( + LoadRequest, + LoadResponse, + CreateRequest, + CreateResponse, + GetRequest, + GetResponse, + InvokeRequest, + InvokeResponse, + DeleteRequest, + DeleteResponse, + SetRequest, + SetResponse, + StaticGetRequest, + StaticInvokeRequest, + StaticSetRequest, + StatsRequest, + StatsResponse, +) + + +class BaseKernel(metaclass=abc.ABCMeta): + + # The API provided by this Kernel is not very pythonic, however it is done to map + # this API as closely to the JSII runtime as possible. Higher level abstractions + # that layer ontop of the Kernel will provide a translation layer that make this + # much more Pythonic. + + @abc.abstractmethod + def load(self, request: LoadRequest) -> LoadResponse: + ... + + @abc.abstractmethod + def create(self, request: CreateRequest) -> CreateResponse: + ... + + @abc.abstractmethod + def get(self, request: GetRequest) -> GetResponse: + ... + + @abc.abstractmethod + def set(self, request: SetRequest) -> SetResponse: + ... + + @abc.abstractmethod + def sget(self, request: StaticGetRequest) -> GetResponse: + ... + + @abc.abstractmethod + def sset(self, request: StaticSetRequest) -> SetResponse: + ... + + @abc.abstractmethod + def invoke(self, request: InvokeRequest) -> InvokeResponse: + ... + + @abc.abstractmethod + def sinvoke(self, request: StaticInvokeRequest) -> InvokeResponse: + ... + + @abc.abstractmethod + def delete(self, request: DeleteRequest) -> DeleteResponse: + ... + + @abc.abstractmethod + def stats(self, request: Optional[StatsRequest] = None) -> StatsResponse: + ... diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py new file mode 100644 index 0000000000..2354fd8278 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py @@ -0,0 +1,217 @@ +import json +import subprocess + +from typing import Type, Union, Mapping, Any, Optional + +import attr +import cattr # type: ignore + +from jsii._utils import memoized_property +from jsii.kernel.providers.base import BaseKernel +from jsii.kernel.types import ( + ObjRef, + KernelRequest, + KernelResponse, + LoadRequest, + LoadResponse, + CreateRequest, + CreateResponse, + DeleteRequest, + DeleteResponse, + GetRequest, + GetResponse, + InvokeRequest, + InvokeResponse, + SetRequest, + SetResponse, + StaticGetRequest, + StaticInvokeRequest, + StaticSetRequest, + StatsRequest, + StatsResponse, +) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class _HelloResponse: + + hello: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class _OkayResponse: + + # We could technically mark this as KernelResponse, because we know that + # it is going to be one of those. However, we can't disambiguate the different + # types because some of them have the same keys as each other, so the only way + # to know what type the result is expected to be, is to know what method is + # being called. Thus we'll expect Any here, and structure this value separately. + ok: Any + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class _ErrorRespose: + + error: str + stack: str + + +_ProcessResponse = Union[_OkayResponse, _ErrorRespose] + + +def _with_api_key(api_name, asdict): + def unstructurer(value): + unstructured = asdict(value) + unstructured["api"] = api_name + + return unstructured + + return unstructurer + + +def _with_reference(data, type_): + return type_(data["$jsii.byref"]) + + +def _unstructure_ref(value): + return {"$jsii.byref": value.ref} + + +class _NodeProcess: + def __init__(self): + self._serializer = cattr.Converter() + self._serializer.register_unstructure_hook( + LoadRequest, + _with_api_key("load", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + CreateRequest, + _with_api_key("create", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + DeleteRequest, + _with_api_key("del", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + GetRequest, _with_api_key("get", self._serializer.unstructure_attrs_asdict) + ) + self._serializer.register_unstructure_hook( + StaticGetRequest, + _with_api_key("sget", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + SetRequest, _with_api_key("set", self._serializer.unstructure_attrs_asdict) + ) + self._serializer.register_unstructure_hook( + StaticSetRequest, + _with_api_key("sset", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + InvokeRequest, + _with_api_key("invoke", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + StaticInvokeRequest, + _with_api_key("sinvoke", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook( + StatsRequest, + _with_api_key("stats", self._serializer.unstructure_attrs_asdict), + ) + self._serializer.register_unstructure_hook(ObjRef, _unstructure_ref) + self._serializer.register_structure_hook(ObjRef, _with_reference) + + def __del__(self): + self.stop() + + def _next_message(self) -> Mapping[Any, Any]: + return json.loads(self._process.stdout.readline()) + + def start(self): + self._process = subprocess.Popen( + "jsii-runtime", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + self.handshake() + + def stop(self): + # TODO: We can write an empty string here instead? + self._process.terminate() + + try: + self._process.wait(timeout=5) + except subprocess.TimeoutExpired: + self._process.kill() + + def handshake(self): + resp: _HelloResponse = self._serializer.structure( + self._next_message(), _HelloResponse + ) + + # TODO: Replace with proper error. + assert ( + resp.hello == "jsii-runtime@0.6.4" + ), f"Invalid JSII Runtime Version: {resp.hello!r}" + + def send( + self, request: KernelRequest, response_type: Type[KernelResponse] + ) -> KernelResponse: + req_dict = self._serializer.unstructure(request) + # TODO: We need a cleaner solution to this, ideally we'll get + # #python-attrs/attrs#429 fixed. + if "property_" in req_dict: + req_dict["property"] = req_dict.pop("property_") + data = json.dumps(req_dict).encode("utf8") + + # Send our data, ensure that it is framed with a trailing \n + self._process.stdin.write(b"%b\n" % (data,)) + self._process.stdin.flush() + + resp: _ProcessResponse = self._serializer.structure( + self._next_message(), _ProcessResponse + ) + + if isinstance(resp, _OkayResponse): + return self._serializer.structure(resp.ok, response_type) + else: + raise NotImplementedError + + +class ProcessKernel(BaseKernel): + @memoized_property + def _process(self) -> _NodeProcess: + process = _NodeProcess() + process.start() + + return process + + def load(self, request: LoadRequest) -> LoadResponse: + return self._process.send(request, LoadResponse) + + def create(self, request: CreateRequest) -> CreateResponse: + return self._process.send(request, CreateResponse) + + def get(self, request: GetRequest) -> GetResponse: + return self._process.send(request, GetResponse) + + def set(self, request: SetRequest) -> SetResponse: + return self._process.send(request, SetResponse) + + def sget(self, request: StaticGetRequest) -> GetResponse: + return self._process.send(request, GetResponse) + + def sset(self, request: StaticSetRequest) -> SetResponse: + return self._process.send(request, SetResponse) + + def invoke(self, request: InvokeRequest) -> InvokeResponse: + return self._process.send(request, InvokeResponse) + + def sinvoke(self, request: StaticInvokeRequest) -> InvokeResponse: + return self._process.send(request, InvokeResponse) + + def delete(self, request: DeleteRequest) -> DeleteResponse: + return self._process.send(request, DeleteResponse) + + def stats(self, request: Optional[StatsRequest] = None) -> StatsResponse: + if request is None: + request = StatsRequest() + return self._process.send(request, StatsResponse) diff --git a/packages/jsii-python-runtime/src/jsii/kernel/types.py b/packages/jsii-python-runtime/src/jsii/kernel/types.py new file mode 100644 index 0000000000..e58f2a84a2 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/kernel/types.py @@ -0,0 +1,230 @@ +from typing import Union, List, Any, Optional, Mapping + +import attr + + +# TODO: +# - HelloResponse +# - OkayResponse +# - ErrorResponse + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ObjRef: + + ref: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class Override: + + method: Optional[str] = None + property_: Optional[str] = None + cookie: Optional[str] = None + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class LoadRequest: + + name: str + version: str + tarball: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class LoadResponse: + + assembly: str + types: int + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CreateRequest: + + fqn: str + args: Optional[List[Any]] = attr.Factory(list) + overrides: Optional[List[Override]] = attr.Factory(list) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CreateResponse(ObjRef): + ... + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class DeleteRequest: + + objref: ObjRef + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class DeleteResponse: + ... + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class GetRequest: + + objref: ObjRef + property_: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class StaticGetRequest: + + fqn: str + property_: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class GetResponse: + + value: Any + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class StaticSetRequest: + + fqn: str + property_: str + value: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class SetRequest: + + objref: ObjRef + property_: str + value: Any + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class SetResponse: + ... + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class StaticInvokeRequest: + + fqn: str + method: str + args: Optional[List[Any]] = attr.Factory(list) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class InvokeRequest: + + objref: ObjRef + method: str + args: Optional[List[Any]] = attr.Factory(list) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class InvokeResponse: + + result: Any + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class BeginRequest: + + objref: ObjRef + method: str + args: Optional[List[Any]] = attr.Factory(list) + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class BeginResponse: + + promiseid: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class EndRequest: + + promiseid: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class EndResponse: + + result: Any + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class Callback: + + cbid: str + cookie: Optional[str] + invoke: Optional[InvokeRequest] + get: Optional[GetRequest] + set: Optional[SetRequest] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CallbacksRequest: + ... + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CallbacksResponse: + + callbacks: List[Callback] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CompleteRequest: + + cbid: str + err: Optional[str] = None + result: Optional[Any] = None + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class CompleteResponse: + + cbid: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class NamingRequest: + + assembly: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class NamingResponse: + + naming: Mapping[str, Mapping[str, Optional[Any]]] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class StatsRequest: + ... + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class StatsResponse: + + objectCount: int + + +KernelRequest = Union[ + LoadRequest, + CreateRequest, + DeleteRequest, + GetRequest, + StaticGetRequest, + InvokeRequest, + StaticInvokeRequest, + StatsRequest, +] + +KernelResponse = Union[ + LoadResponse, + CreateResponse, + DeleteResponse, + GetResponse, + InvokeResponse, + StatsResponse, +] diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py new file mode 100644 index 0000000000..4d14021045 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -0,0 +1,193 @@ +from typing import Any, Callable, TypeVar + +import typing +import weakref + + +class JSIIMeta(type): + def __new__(cls, name, bases, attrs, *, jsii_type, jsii_kernel): + # TODO: We need to figure out exactly what we're going to do this the kernel + # here. Right now we're "creating" a new one per type, and relying on + # the fact it's a singleton so that everything is in the same kernel. + # That might not make complete sense though, particularly if we ever + # want to have multiple kernels in a single process (does that even + # make sense?). Perhaps we should pass it in like we pass the type, and + # have the autogenerated code either create it once per library or once + # per process. + attrs["__jsii_kernel__"] = jsii_kernel + attrs["__jsii_type__"] = jsii_type + + # We need to lift all of the classproperty instances out of the class, because + # they need to actually be set *on* the metaclass.. which is us. However we + # don't want to have to derive a separate metaclass for each class, so instead + # we're going to dynamically handle these. + class_properties, new_attrs = {}, {} + for key, value in attrs.items(): + if isinstance(value, jsii_classproperty): + class_properties[key] = value + else: + new_attrs[key] = value + new_attrs["__jsii_class_properties__"] = class_properties + + obj = type.__new__(cls, name, bases, new_attrs) + + # We need to go through an implement the __set_name__ portion of our API. + for key, value in obj.__jsii_class_properties__.items(): + value.__set_name__(obj, key) + + return obj + + def __call__(cls, *args, **kwargs): + # Create our object at the Python level. + obj = cls.__new__(cls, *args, **kwargs) + + # Create our object at the JS level. + # TODO: Handle args/kwargs + # TODO: Handle Overrides + obj.__jsii_ref__ = cls.__jsii_kernel__.create(cls) + + # Whenever the object we're creating gets garbage collected, then we want to + # delete it from the JS runtime as well. + # TODO: Figure out if this is *really* true, what happens if something goes + # out of scope at the Python level, but something is holding onto it + # at the JS level? What mechanics are in place for this if any? + weakref.finalize(obj, cls.__jsii_kernel__.delete, obj.__jsii_ref__) + + # Instatiate our object at the PYthon level. + if isinstance(obj, cls): + obj.__init__(*args, **kwargs) + + return obj + + def __getattr__(obj, name): + if name in obj.__jsii_class_properties__: + return obj.__jsii_class_properties__[name].__get__(obj, None) + + raise AttributeError(f"type object {obj.__name__!r} has no attribute {name!r}") + + def __setattr__(obj, name, value): + if name in obj.__jsii_class_properties__: + return obj.__jsii_class_properties__[name].__set__(obj, value) + + return super().__setattr__(name, value) + + +# NOTE: We do this goofy thing so that typing works on our generated stub classes, +# because MyPy does not currently understand the decorator protocol very well. +# Something like https://github.com/python/peps/pull/242 should make this no +# longer required. +if typing.TYPE_CHECKING: + jsii_property = property +else: + # The naming is a little funky on this, since it's a class but named like a + # function. This is done to better mimic other decorators like @proeprty. + class jsii_property: + + # We throw away the getter function here, because it doesn't really matter or + # provide us with anything useful. It exists only to provide a way to pass + # naming into us, and so that consumers of this library can "look at the + # source" and at least see something that resembles the structure of the + # library they're using, even though it won't have any of the body of the code. + def __init__(self, getter): + pass + + # TODO: Figure out a way to let the caller of this override the name. This might + # be useful in cases where the name that the JS level code is using isn't + # a valid python identifier, but we still want to be able to bind it, and + # doing so would require giving it a different name at the Python level. + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + return instance.__jsii_kernel__.get(instance.__jsii_ref__, self.name) + + def __set__(self, instance, value): + instance.__jsii_kernel__.set(instance.__jsii_ref__, self.name, value) + + +class _JSIIMethod: + def __init__(self, obj, method_name): + self.obj = obj + self.method_name = method_name + + def __call__(self, *args): + kernel = self.obj.__jsii_kernel__ + return kernel.invoke(self.obj.__jsii_ref__, self.method_name, args) + + +# NOTE: We do this goofy thing so that typing works on our generated stub classes, +# because MyPy does not currently understand the decorator protocol very well. +# Something like https://github.com/python/peps/pull/242 should make this no +# longer required. +if typing.TYPE_CHECKING: + F = TypeVar("F", bound=Callable[..., Any]) + + def jsii_method(func: F) -> F: + ... + + +else: + # Again, the naming is a little funky on this, since it's a class but named like a + # function. This is done to better mimic other decorators like @classmethod. + class jsii_method: + + # Again, we're throwing away the actual function body, because it exists only + # to provide the structure of the library for people who read the code, and a + # way to pass the name/typing signatures through. + def __init__(self, meth): + pass + + # TODO: Figure out a way to let the caller of this override the name. This might + # be useful in cases where the name that the JS level code is using isn't + # a valid python identifier, but we still want to be able to bind it, and + # doing so would require giving it a different name at the Python level. + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + return _JSIIMethod(instance, self.name) + + +class _JSIIClassMethod: + def __init__(self, klass, method_name): + self.klass = klass + self.method_name = method_name + + def __call__(self, *args): + kernel = self.klass.__jsii_kernel__ + return kernel.sinvoke(self.klass, self.method_name, args) + + +if typing.TYPE_CHECKING: + jsii_classmethod = classmethod +else: + + class jsii_classmethod: + def __init__(self, meth): + pass + + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + return _JSIIClassMethod(owner, self.name) + + +if typing.TYPE_CHECKING: + # TODO: Figure out if this type checks correctly, if not how do we make it type + # check correctly... or is it even possible at all? + jsii_classproperty = property +else: + + class jsii_classproperty: + def __init__(self, meth): + pass + + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + return instance.__jsii_kernel__.sget(instance, self.name) + + def __set__(self, instance, value): + instance.__jsii_kernel__.sset(instance, self.name, value) From fa291d77f9fecf88a904bc11bbbf111424d4aabe Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 5 Sep 2018 16:55:47 -0400 Subject: [PATCH 002/117] Bump versions --- packages/jsii-python-runtime/package.json | 12 ++---------- .../src/jsii/kernel/providers/process.py | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/jsii-python-runtime/package.json b/packages/jsii-python-runtime/package.json index bce2c58736..69f6b2eaa9 100644 --- a/packages/jsii-python-runtime/package.json +++ b/packages/jsii-python-runtime/package.json @@ -9,24 +9,16 @@ "test": "echo ok" }, "dependencies": { - "jsii-runtime": "^0.6.4" + "jsii-runtime": "^0.7.1" }, "repository": { "type": "git", "url": "git://github.com/awslabs/jsii" }, - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com" - }, "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com", "organization": true }, - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "https://github.com/awslabs/jsii.git" - } + "license": "Apache-2.0" } diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py index 2354fd8278..3658c1a6a0 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py @@ -149,7 +149,7 @@ def handshake(self): # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.6.4" + resp.hello == "jsii-runtime@0.7.1" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( From 3180d972eecd5c78dfc3e519e29c4fa8bd7270db Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 11 Sep 2018 12:58:18 -0400 Subject: [PATCH 003/117] Upgrade for latest JSII --- .../jsii-python-runtime/src/jsii/kernel/providers/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py index 3658c1a6a0..d291564edd 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py @@ -149,7 +149,7 @@ def handshake(self): # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.7.1" + resp.hello == "jsii-runtime@0.7.4" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( From 1a9297c926e282b7db91d2c7b6cdbdccefb9fb48 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 11 Sep 2018 15:57:49 -0400 Subject: [PATCH 004/117] Handle non-primitive types being returned from JSII runtime --- .../src/jsii/kernel/__init__.py | 30 +++++++++-- .../src/jsii/kernel/providers/process.py | 12 ++++- .../jsii-python-runtime/src/jsii/runtime.py | 52 +++++++++++++++++-- 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/kernel/__init__.py index 82d489a0e4..bf6250e56a 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/kernel/__init__.py @@ -1,7 +1,12 @@ from typing import Any, List, Optional, Type +import collections.abc +import functools + import attr +import jsii.runtime + from jsii._utils import Singleton from jsii.kernel.providers import BaseKernel, ProcessKernel from jsii.kernel.types import ( @@ -19,6 +24,23 @@ ) +def _recursize_dereference(d): + if isinstance(d, collections.abc.Mapping): + return {k: _recursize_dereference(v) for k, v in d.items()} + elif isinstance(d, ObjRef): + return jsii.runtime.resolve_reference(d) + else: + return d + + +def _dereferenced(fn): + @functools.wraps(fn) + def wrapped(*args, **kwargs): + return _recursize_dereference(fn(*args, **kwargs)) + + return wrapped + + @attr.s(auto_attribs=True, frozen=True, slots=True) class Statistics: @@ -52,14 +74,14 @@ def create(self, klass: Any) -> ObjRef: def delete(self, ref: ObjRef) -> None: self.provider.delete(DeleteRequest(objref=ref)) + @_dereferenced def get(self, ref: ObjRef, property: str) -> Any: return self.provider.get(GetRequest(objref=ref, property_=property)).value def set(self, ref: ObjRef, property: str, value: Any) -> None: - self.provider.set( - SetRequest(objref=ref, property_=property, value=value) - ) + self.provider.set(SetRequest(objref=ref, property_=property, value=value)) + @_dereferenced def sget(self, klass: Any, property: str) -> Any: return self.provider.sget( StaticGetRequest(fqn=klass.__jsii_type__, property_=property) @@ -70,6 +92,7 @@ def sset(self, klass: Any, property: str, value: Any) -> None: StaticSetRequest(fqn=klass.__jsii_type__, property_=property, value=value) ) + @_dereferenced def invoke(self, ref: ObjRef, method: str, args: Optional[List[Any]] = None) -> Any: if args is None: args = [] @@ -78,6 +101,7 @@ def invoke(self, ref: ObjRef, method: str, args: Optional[List[Any]] = None) -> InvokeRequest(objref=ref, method=method, args=args) ).result + @_dereferenced def sinvoke(self, klass: Any, method: str, args: Optional[List[Any]] = None) -> Any: if args is None: args = [] diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py index d291564edd..3e5451a525 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py @@ -70,13 +70,21 @@ def unstructurer(value): def _with_reference(data, type_): - return type_(data["$jsii.byref"]) + if not isinstance(data, type_): + return type_(ref=data.ref) + return data def _unstructure_ref(value): return {"$jsii.byref": value.ref} +def ohook(d): + if d.keys() == {"$jsii.byref"}: + return ObjRef(ref=d["$jsii.byref"]) + return d + + class _NodeProcess: def __init__(self): self._serializer = cattr.Converter() @@ -125,7 +133,7 @@ def __del__(self): self.stop() def _next_message(self) -> Mapping[Any, Any]: - return json.loads(self._process.stdout.readline()) + return json.loads(self._process.stdout.readline(), object_hook=ohook) def start(self): self._process = subprocess.Popen( diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py index 4d14021045..ee28a8c17c 100644 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -4,6 +4,38 @@ import weakref +_types = {} + + +class _ReferenceMap: + def __init__(self, types): + self._refs = weakref.WeakValueDictionary() + self._types = types + + def register(self, ref, inst): + self._refs[ref] = inst + + def resolve(self, ref): + # First we need to check our reference map to see if we have any instance that + # already matches this reference. + try: + return self._refs[ref.ref] + except KeyError: + pass + + # If we got to this point, then we didn't have a referene for this, in that case + # we want to create a new instance, but we need to create it in such a way that + # we don't try to recreate the type inside of the JSII interface. + class_ = _types[ref.ref.split("@", 1)[0]] + return class_.__class__.from_reference(class_, ref) + + +_refs = _ReferenceMap(_types) + + +resolve_reference = _refs.resolve + + class JSIIMeta(type): def __new__(cls, name, bases, attrs, *, jsii_type, jsii_kernel): # TODO: We need to figure out exactly what we're going to do this the kernel @@ -35,16 +67,18 @@ def __new__(cls, name, bases, attrs, *, jsii_type, jsii_kernel): for key, value in obj.__jsii_class_properties__.items(): value.__set_name__(obj, key) + _types[obj.__jsii_type__] = obj + return obj def __call__(cls, *args, **kwargs): - # Create our object at the Python level. - obj = cls.__new__(cls, *args, **kwargs) - # Create our object at the JS level. # TODO: Handle args/kwargs # TODO: Handle Overrides - obj.__jsii_ref__ = cls.__jsii_kernel__.create(cls) + ref = cls.__jsii_kernel__.create(cls) + + # Create our object at the Python level. + obj = cls.__class__.from_reference(cls, ref, *args, **kwargs) # Whenever the object we're creating gets garbage collected, then we want to # delete it from the JS runtime as well. @@ -53,12 +87,20 @@ def __call__(cls, *args, **kwargs): # at the JS level? What mechanics are in place for this if any? weakref.finalize(obj, cls.__jsii_kernel__.delete, obj.__jsii_ref__) - # Instatiate our object at the PYthon level. + # Instatiate our object at the Python level. if isinstance(obj, cls): obj.__init__(*args, **kwargs) return obj + def from_reference(cls, ref, *args, **kwargs): + obj = cls.__new__(cls, *args, **kwargs) + obj.__jsii_ref__ = ref + + _refs.register(obj.__jsii_ref__.ref, obj) + + return obj + def __getattr__(obj, name): if name in obj.__jsii_class_properties__: return obj.__jsii_class_properties__[name].__get__(obj, None) From c4c652ddbccd75f82152022ab1d4be8f1f4786c0 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 20 Sep 2018 01:14:19 -0400 Subject: [PATCH 005/117] Switch to using a single, global Kernel --- packages/jsii-python-runtime/src/jsii/runtime.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py index ee28a8c17c..048f5dc643 100644 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -3,6 +3,14 @@ import typing import weakref +from jsii.kernel import Kernel + + +# Yea, a global here is kind of gross, however, there's not really a better way of +# handling this. Fundamentally this is a global value, since we can only reasonably +# have a single kernel active at any one time in a real program. +kernel = Kernel() + _types = {} @@ -37,7 +45,7 @@ def resolve(self, ref): class JSIIMeta(type): - def __new__(cls, name, bases, attrs, *, jsii_type, jsii_kernel): + def __new__(cls, name, bases, attrs, *, jsii_type): # TODO: We need to figure out exactly what we're going to do this the kernel # here. Right now we're "creating" a new one per type, and relying on # the fact it's a singleton so that everything is in the same kernel. @@ -46,7 +54,7 @@ def __new__(cls, name, bases, attrs, *, jsii_type, jsii_kernel): # make sense?). Perhaps we should pass it in like we pass the type, and # have the autogenerated code either create it once per library or once # per process. - attrs["__jsii_kernel__"] = jsii_kernel + attrs["__jsii_kernel__"] = kernel attrs["__jsii_type__"] = jsii_type # We need to lift all of the classproperty instances out of the class, because From a162358509a3cc2ad50c1d9dd0246ff47027e9ee Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 20 Sep 2018 01:53:40 -0400 Subject: [PATCH 006/117] Rearrange imports to deal with import cycles --- .../src/jsii/{kernel => _kernel}/__init__.py | 9 ++-- .../src/jsii/_kernel/providers/__init__.py | 5 +++ .../{kernel => _kernel}/providers/base.py | 2 +- .../{kernel => _kernel}/providers/process.py | 4 +- .../src/jsii/{kernel => _kernel}/types.py | 0 .../src/jsii/_reference_map.py | 39 ++++++++++++++++++ .../src/jsii/kernel/providers/__init__.py | 5 --- .../jsii-python-runtime/src/jsii/runtime.py | 41 +++---------------- 8 files changed, 57 insertions(+), 48 deletions(-) rename packages/jsii-python-runtime/src/jsii/{kernel => _kernel}/__init__.py (95%) create mode 100644 packages/jsii-python-runtime/src/jsii/_kernel/providers/__init__.py rename packages/jsii-python-runtime/src/jsii/{kernel => _kernel}/providers/base.py (98%) rename packages/jsii-python-runtime/src/jsii/{kernel => _kernel}/providers/process.py (98%) rename packages/jsii-python-runtime/src/jsii/{kernel => _kernel}/types.py (100%) create mode 100644 packages/jsii-python-runtime/src/jsii/_reference_map.py delete mode 100644 packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py diff --git a/packages/jsii-python-runtime/src/jsii/kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py similarity index 95% rename from packages/jsii-python-runtime/src/jsii/kernel/__init__.py rename to packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index bf6250e56a..b61868ac66 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -5,11 +5,10 @@ import attr -import jsii.runtime - +from jsii import _reference_map from jsii._utils import Singleton -from jsii.kernel.providers import BaseKernel, ProcessKernel -from jsii.kernel.types import ( +from jsii._kernel.providers import BaseKernel, ProcessKernel +from jsii._kernel.types import ( LoadRequest, CreateRequest, DeleteRequest, @@ -28,7 +27,7 @@ def _recursize_dereference(d): if isinstance(d, collections.abc.Mapping): return {k: _recursize_dereference(v) for k, v in d.items()} elif isinstance(d, ObjRef): - return jsii.runtime.resolve_reference(d) + return _reference_map.resolve_reference(d) else: return d diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/__init__.py new file mode 100644 index 0000000000..26ec99a6a2 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/__init__.py @@ -0,0 +1,5 @@ +from jsii._kernel.providers.base import BaseKernel +from jsii._kernel.providers.process import ProcessKernel + + +__all__ = ["BaseKernel", "ProcessKernel"] diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/base.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/base.py similarity index 98% rename from packages/jsii-python-runtime/src/jsii/kernel/providers/base.py rename to packages/jsii-python-runtime/src/jsii/_kernel/providers/base.py index 4fd28cdbb3..27699379b4 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/base.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/base.py @@ -2,7 +2,7 @@ from typing import Optional -from jsii.kernel.types import ( +from jsii._kernel.types import ( LoadRequest, LoadResponse, CreateRequest, diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py similarity index 98% rename from packages/jsii-python-runtime/src/jsii/kernel/providers/process.py rename to packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 3e5451a525..7bae4e4144 100644 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -7,8 +7,8 @@ import cattr # type: ignore from jsii._utils import memoized_property -from jsii.kernel.providers.base import BaseKernel -from jsii.kernel.types import ( +from jsii._kernel.providers.base import BaseKernel +from jsii._kernel.types import ( ObjRef, KernelRequest, KernelResponse, diff --git a/packages/jsii-python-runtime/src/jsii/kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py similarity index 100% rename from packages/jsii-python-runtime/src/jsii/kernel/types.py rename to packages/jsii-python-runtime/src/jsii/_kernel/types.py diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py new file mode 100644 index 0000000000..c04d74eeaa --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -0,0 +1,39 @@ +# This module exists to break an import cycle between jsii.runtime and jsii.kernel +import weakref + + +_types = {} + + +def register_type(type_, obj): + _types[type_] = obj + + +class _ReferenceMap: + def __init__(self, types): + self._refs = weakref.WeakValueDictionary() + self._types = types + + def register(self, ref, inst): + self._refs[ref] = inst + + def resolve(self, ref): + # First we need to check our reference map to see if we have any instance that + # already matches this reference. + try: + return self._refs[ref.ref] + except KeyError: + pass + + # If we got to this point, then we didn't have a referene for this, in that case + # we want to create a new instance, but we need to create it in such a way that + # we don't try to recreate the type inside of the JSII interface. + class_ = _types[ref.ref.split("@", 1)[0]] + return class_.__class__.from_reference(class_, ref) + + +_refs = _ReferenceMap(_types) + + +register_reference = _refs.register +resolve_reference = _refs.resolve diff --git a/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py b/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py deleted file mode 100644 index ba922882f9..0000000000 --- a/packages/jsii-python-runtime/src/jsii/kernel/providers/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from jsii.kernel.providers.base import BaseKernel -from jsii.kernel.providers.process import ProcessKernel - - -__all__ = ["BaseKernel", "ProcessKernel"] diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py index 048f5dc643..5b048e5277 100644 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -2,8 +2,11 @@ import typing import weakref +import os -from jsii.kernel import Kernel +from jsii import _reference_map +from jsii._compat import importlib_resources +from jsii._kernel import Kernel # Yea, a global here is kind of gross, however, there's not really a better way of @@ -12,38 +15,6 @@ kernel = Kernel() -_types = {} - - -class _ReferenceMap: - def __init__(self, types): - self._refs = weakref.WeakValueDictionary() - self._types = types - - def register(self, ref, inst): - self._refs[ref] = inst - - def resolve(self, ref): - # First we need to check our reference map to see if we have any instance that - # already matches this reference. - try: - return self._refs[ref.ref] - except KeyError: - pass - - # If we got to this point, then we didn't have a referene for this, in that case - # we want to create a new instance, but we need to create it in such a way that - # we don't try to recreate the type inside of the JSII interface. - class_ = _types[ref.ref.split("@", 1)[0]] - return class_.__class__.from_reference(class_, ref) - - -_refs = _ReferenceMap(_types) - - -resolve_reference = _refs.resolve - - class JSIIMeta(type): def __new__(cls, name, bases, attrs, *, jsii_type): # TODO: We need to figure out exactly what we're going to do this the kernel @@ -75,7 +46,7 @@ def __new__(cls, name, bases, attrs, *, jsii_type): for key, value in obj.__jsii_class_properties__.items(): value.__set_name__(obj, key) - _types[obj.__jsii_type__] = obj + _reference_map.register_type(obj.__jsii_type__, obj) return obj @@ -105,7 +76,7 @@ def from_reference(cls, ref, *args, **kwargs): obj = cls.__new__(cls, *args, **kwargs) obj.__jsii_ref__ = ref - _refs.register(obj.__jsii_ref__.ref, obj) + _reference_map.register_reference(obj.__jsii_ref__.ref, obj) return obj From 59c7876df6688ebb643caa7865fcfe62e1944ff8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 20 Sep 2018 01:54:38 -0400 Subject: [PATCH 007/117] Provide a mechanism to load JSII Assemblies --- .../jsii-python-runtime/src/jsii/_compat.py | 7 +++++ .../jsii-python-runtime/src/jsii/runtime.py | 30 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 packages/jsii-python-runtime/src/jsii/_compat.py diff --git a/packages/jsii-python-runtime/src/jsii/_compat.py b/packages/jsii-python-runtime/src/jsii/_compat.py new file mode 100644 index 0000000000..0d2cfa5e96 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/_compat.py @@ -0,0 +1,7 @@ +try: + import importlib.resources as importlib_resources +except ImportError: + import importlib_resources + + +__all__ = ["importlib_resources"] diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py index 5b048e5277..f31e7e2a45 100644 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -4,6 +4,8 @@ import weakref import os +import attr + from jsii import _reference_map from jsii._compat import importlib_resources from jsii._kernel import Kernel @@ -15,6 +17,34 @@ kernel = Kernel() +@attr.s(auto_attribs=True, frozen=True, slots=True) +class JSIIAssembly: + + name: str + version: str + module: str + filename: str + + @classmethod + def load(cls, *args, _kernel=kernel, **kwargs): + # Our object here really just acts as a record for our JSIIAssembly, it doesn't + # offer any functionality itself, besides this class method that will trigger + # the loading of the given assembly in the JSII Kernel. + assembly = cls(*args, **kwargs) + + # Actually load the assembly into the kernel, we're using the + # importlib.resources API here isntead of manually constructing the path, in + # the hopes that this will make JSII modules able to be used with zipimport + # instead of only on the FS. + with importlib_resources.path( + f"{assembly.module}._jsii", assembly.filename + ) as assembly_path: + _kernel.load(assembly.name, assembly.version, os.fspath(assembly_path)) + + # Give our record of the assembly back to the caller. + return assembly + + class JSIIMeta(type): def __new__(cls, name, bases, attrs, *, jsii_type): # TODO: We need to figure out exactly what we're going to do this the kernel From ad57330e8e3b303ac687be81d1a8a5a2ff3afffb Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 20 Sep 2018 01:58:23 -0400 Subject: [PATCH 008/117] Add the WIP Python target for pacmak --- packages/jsii-pacmak/lib/targets/python.ts | 344 +++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 packages/jsii-pacmak/lib/targets/python.ts diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts new file mode 100644 index 0000000000..199ab0dab5 --- /dev/null +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -0,0 +1,344 @@ +/* tslint:disable */ +import path = require('path'); +import util = require('util'); + +import * as spec from 'jsii-spec'; +import { Generator, GeneratorOptions } from '../generator'; +import { Target, TargetOptions } from '../target'; +import { CodeMaker } from 'codemaker'; +import { shell } from '../util'; + +export default class Python extends Target { + protected readonly generator = new PythonGenerator(); + + constructor(options: TargetOptions) { + super(options); + } + + public async build(sourceDir: string, outDir: string): Promise { + // Format our code to make it easier to read, we do this here instead of trying + // to do it in the code generation phase, because attempting to mix style and + // function makes the code generation harder to maintain and read, while doing + // this here is easy. + await shell("black", ["--py36", sourceDir], {}); + + return this.copyFiles(sourceDir, outDir); + } +} + +// ################## +// # CODE GENERATOR # +// ################## +const debug = function(o: any) { + console.log(util.inspect(o, false, null, true)); +} + + +class Module { + + readonly name: string; + readonly assembly?: spec.Assembly; + readonly assemblyFilename?: string; + + private buffer: object[]; + + constructor(ns: string, assembly?: [spec.Assembly, string]) { + this.name = ns; + + if (assembly != undefined) { + this.assembly = assembly[0]; + this.assemblyFilename = assembly[1]; + } + + this.buffer = []; + } + + // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot + // Operate on more than one file at a time, so we have to buffer our calls to + // CodeMaker, otherwise we can end up in inconsistent state when we get things like: + // - onBeginNamespace(foo) + // - onBeginNamespace(foo.bar) + // - OnEndNamespace(foo.bar) + // - Inconsitent State, where we're now back in the scope of foo, but due to + // the fact that if we had opened a file in onBeginNamespace(foo), we would + // have had to close it for onBeginNamespace(foo.bar), and re-opening it + // would overwrite the contents. + // - OnEndNamespace(foo) + // To solve this, we buffer all of the things we *would* have written out via + // CodeMaker via this API, and then we will just iterate over it in the + // onEndNamespace event and write it out then. + + public line(...args: any[]) { + this.buffer.push({method: "line", args: args}); + } + + public indent(...args: any[]) { + this.buffer.push({method: "indent", args: args}); + } + + public unindent(...args: any[]) { + this.buffer.push({method: "unindent", args: args}); + } + + public open(...args: any[]) { + this.buffer.push({method: "open", args: args}); + } + + public close(...args: any[]) { + this.buffer.push({method: "close", args: args}); + } + + public openBlock(...args: any[]) { + this.buffer.push({method: "openBlock", args: args}); + } + + public closeBlock(...args: any[]) { + this.buffer.push({method: "closeBlock", args: args}); + } + + public write(code: CodeMaker) { + // Before we do Anything, we need to write out our module headers, this is where + // we handle stuff like imports, any required initialization, etc. + code.line("from jsii.runtime import JSIIAssembly, JSIIMeta, jsii_method, jsii_property, jsii_classmethod, jsii_classproperty") + + // Determine if we need to write out the kernel load line. + if (this.assembly && this.assemblyFilename) { + code.line(`__jsii_assembly__ = JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); + } + + // Now that we've gotten all of the module header stuff done, we need to go + // through and actually write out the meat of our module. + for (let buffered of this.buffer) { + let methodName = (buffered as any)["method"] as string; + let args = (buffered as any)["args"] as any[]; + + (code as any)[methodName](...args); + } + } +} + +class PythonGenerator extends Generator { + + private moduleStack: Module[]; + + constructor(options = new GeneratorOptions()) { + super(options); + + this.code.openBlockFormatter = s => `${s}:`; + this.code.closeBlockFormatter = _s => ""; + + this.moduleStack = []; + } + + protected getAssemblyOutputDir(mod: spec.Assembly) { + return path.join("src", this.toPythonModuleName(mod.name), "_jsii"); + } + + protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { + debug("onBeginAssembly"); + + // We need to write out an __init__.py for our _jsii package so that + // importlib.resources will be able to load our assembly from it. + const assemblyInitFilename = path.join(this.getAssemblyOutputDir(assm), "__init__.py"); + + this.code.openFile(assemblyInitFilename); + this.code.closeFile(assemblyInitFilename); + } + + protected onBeginNamespace(ns: string) { + debug(`onBeginNamespace: ${ns}`); + + const moduleName = this.toPythonModuleName(ns); + const loadAssembly = this.assembly.name == ns ? true : false; + + let moduleArgs: any[] = []; + + if (loadAssembly) { + moduleArgs.push([this.assembly, this.getAssemblyFileName()]); + } + + this.moduleStack.push(new Module(moduleName, ...moduleArgs)); + } + + protected onEndNamespace(ns: string) { + debug(`onEndNamespace: ${ns}`); + + let module = this.moduleStack.pop() as Module; + let moduleFilename = path.join("src", this.toPythonModuleFilename(module.name), "__init__.py"); + + this.code.openFile(moduleFilename); + module.write(this.code); + this.code.closeFile(moduleFilename); + } + + protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { + debug("onBeginClass"); + + // TODO: Figure out what to do with abstract here. + abstract; + + this.currentModule().openBlock(`class ${cls.name}(metaclass=JSIIMeta, jsii_type="${cls.fqn}")`); + } + + protected onEndClass(_cls: spec.ClassType) { + debug("onEndClass"); + + this.currentModule().closeBlock(); + } + + protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { + debug("onStaticMethod"); + + // TODO: Handle the case where the Python name and the JSII name differ. + this.currentModule().line("@jsii_classmethod"); + this.emitPythonMethod(method.name, "cls", method.parameters, method.returns); + } + + protected onMethod(_cls: spec.ClassType, method: spec.Method) { + debug("onMethod"); + + this.currentModule().line("@jsii_method"); + this.emitPythonMethod(method.name, "self", method.parameters, method.returns); + } + + protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { + debug("onStaticProperty"); + + // TODO: Properties have a bunch of states, they can have getters and setters + // we need to better handle all of these cases. + this.currentModule().line("@jsii_classproperty"); + this.emitPythonMethod(prop.name, "self", [], prop.type); + } + + protected onProperty(_cls: spec.ClassType, prop: spec.Property) { + debug("onProperty"); + + this.currentModule().line("@jsii_property"); + this.emitPythonMethod(prop.name, "self", [], prop.type); + } + + private emitPythonMethod(name?: string, implicitParam?: string, params: spec.Parameter[] = [], returns?: spec.TypeReference) { + // TODO: Handle imports (if needed) for type. + const returnType = returns ? this.toPythonType(returns) : "None"; + + // We need to turn a list of JSII parameters, into Python style arguments with + // gradual typing, so we'll have to iterate over the list of parameters, and + // build the list, converting as we go. + // TODO: Handle imports (if needed) for all of these types. + + let pythonParams: string[] = implicitParam ? [implicitParam] : []; + for (let param of params) { + pythonParams.push(`${param.name}: ${this.toPythonType(param.type)}`); + } + + let module = this.currentModule(); + + module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${returnType}`); + module.line("..."); + module.closeBlock(); + } + + private toPythonType(typeref: spec.TypeReference): string { + if (spec.isPrimitiveTypeReference(typeref)) { + return this.toPythonPrimitive(typeref.primitive); + } else if (spec.isNamedTypeReference(typeref)) { + // TODO: We need to actually handle this, isntead of just returning the FQN + // as a string. + return `"${typeref.fqn}"`; + } else { + throw new Error("Invalid type reference: " + JSON.stringify(typeref)); + } + + /* + if (spec.isPrimitiveTypeReference(typeref)) { + return [ this.toJavaPrimitive(typeref.primitive) ]; + } else if (spec.isCollectionTypeReference(typeref)) { + return [ this.toJavaCollection(typeref, forMarshalling) ]; + } else if (spec.isNamedTypeReference(typeref)) { + return [ this.toNativeFqn(typeref.fqn) ]; + } else if (typeref.union) { + const types = new Array(); + for (const subtype of typeref.union.types) { + for (const t of this.toJavaTypes(subtype, forMarshalling)) { + types.push(t); + } + } + return types; + } else { + throw new Error('Invalid type reference: ' + JSON.stringify(typeref)); + } + */ + + /* + switch (primitive) { + case spec.PrimitiveType.Boolean: return 'java.lang.Boolean'; + case spec.PrimitiveType.Date: return 'java.time.Instant'; + case spec.PrimitiveType.Json: return 'com.fasterxml.jackson.databind.node.ObjectNode'; + case spec.PrimitiveType.Number: return 'java.lang.Number'; + case spec.PrimitiveType.String: return 'java.lang.String'; + case spec.PrimitiveType.Any: return 'java.lang.Object'; + default: + throw new Error('Unknown primitive type: ' + primitive); + } + */ + } + + private toPythonPrimitive(primitive: spec.PrimitiveType): string { + switch (primitive) { + case spec.PrimitiveType.String: + return "str"; + default: + throw new Error("Unknown primitive type: " + primitive); + } + } + + private currentModule(): Module { + return this.moduleStack.slice(-1)[0]; + } + + private toPythonModuleName(name: string): string { + return this.code.toSnakeCase(name.replace(/-/g, "_")); + } + + private toPythonModuleFilename(name: string): string { + return name.replace(/\./g, "/"); + } + + // Not Currently Used + + protected onEndAssembly(_assm: spec.Assembly, _fingerprint: boolean) { + debug("onEndAssembly"); + } + + protected onBeginInterface(_ifc: spec.InterfaceType) { + debug("onBeginInterface"); + } + + protected onEndInterface(_ifc: spec.InterfaceType) { + debug("onEndInterface"); + } + + protected onInterfaceMethod(_ifc: spec.InterfaceType, _method: spec.Method) { + debug("onInterfaceMethod"); + } + + protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { + debug("onInterfaceMethodOverload"); + } + + protected onInterfaceProperty(_ifc: spec.InterfaceType, _prop: spec.Property) { + debug("onInterfaceProperty"); + } + + protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { + debug("onUnionProperty"); + } + + protected onMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { + debug("onMethodOverload"); + } + + protected onStaticMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { + debug("onStaticMethodOverload"); + } +} From 0e4225fe3e6ef546090ff9e4acd90fe4281c9d2c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 12:00:30 -0400 Subject: [PATCH 009/117] Prefix all of our interal names with _ --- packages/jsii-pacmak/lib/targets/python.ts | 35 +++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 199ab0dab5..8a95e0fa88 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -99,11 +99,23 @@ class Module { public write(code: CodeMaker) { // Before we do Anything, we need to write out our module headers, this is where // we handle stuff like imports, any required initialization, etc. - code.line("from jsii.runtime import JSIIAssembly, JSIIMeta, jsii_method, jsii_property, jsii_classmethod, jsii_classproperty") + code.line( + this.generateImportFrom( + "jsii.runtime", + [ + "JSIIAssembly", + "JSIIMeta", + "jsii_method", + "jsii_property", + "jsii_classmethod", + "jsii_classproperty", + ] + ) + ) // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { - code.line(`__jsii_assembly__ = JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); + code.line(`__jsii_assembly__ = _runtime.JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); } // Now that we've gotten all of the module header stuff done, we need to go @@ -115,6 +127,15 @@ class Module { (code as any)[methodName](...args); } } + + private generateImportFrom(from: string, names: string[]): string { + // Whenever we import something, we want to prefix all of the names we're + // importing with an underscore to indicate that these names are private. We + // do this, because otherwise we could get clashes in the names we use, and the + // names of exported classes. + const importNames = names.map(n => `${n} as _${n}`); + return `from ${from} import ${importNames.join(", ")}`; + } } class PythonGenerator extends Generator { @@ -177,7 +198,7 @@ class PythonGenerator extends Generator { // TODO: Figure out what to do with abstract here. abstract; - this.currentModule().openBlock(`class ${cls.name}(metaclass=JSIIMeta, jsii_type="${cls.fqn}")`); + this.currentModule().openBlock(`class ${cls.name}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); } protected onEndClass(_cls: spec.ClassType) { @@ -190,14 +211,14 @@ class PythonGenerator extends Generator { debug("onStaticMethod"); // TODO: Handle the case where the Python name and the JSII name differ. - this.currentModule().line("@jsii_classmethod"); + this.currentModule().line("@_jsii_classmethod"); this.emitPythonMethod(method.name, "cls", method.parameters, method.returns); } protected onMethod(_cls: spec.ClassType, method: spec.Method) { debug("onMethod"); - this.currentModule().line("@jsii_method"); + this.currentModule().line("@_jsii_method"); this.emitPythonMethod(method.name, "self", method.parameters, method.returns); } @@ -206,14 +227,14 @@ class PythonGenerator extends Generator { // TODO: Properties have a bunch of states, they can have getters and setters // we need to better handle all of these cases. - this.currentModule().line("@jsii_classproperty"); + this.currentModule().line("@_jsii_classproperty"); this.emitPythonMethod(prop.name, "self", [], prop.type); } protected onProperty(_cls: spec.ClassType, prop: spec.Property) { debug("onProperty"); - this.currentModule().line("@jsii_property"); + this.currentModule().line("@_jsii_property"); this.emitPythonMethod(prop.name, "self", [], prop.type); } From 89e4422585d62fe3f592e4ccbcd0c85b6cf2dc0a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 12:11:32 -0400 Subject: [PATCH 010/117] Write out an __all__ that lists our exported names --- packages/jsii-pacmak/lib/targets/python.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8a95e0fa88..c1e684c867 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -41,6 +41,7 @@ class Module { readonly assemblyFilename?: string; private buffer: object[]; + private exportedNames: string[]; constructor(ns: string, assembly?: [spec.Assembly, string]) { this.name = ns; @@ -51,6 +52,13 @@ class Module { } this.buffer = []; + this.exportedNames = []; + } + + // Adds a name to the list of names that this module will export, this will control + // things like what is listed inside of __all__. + public exportName(name: string) { + this.exportedNames.push(name); } // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot @@ -115,6 +123,7 @@ class Module { // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { + this.exportName("__jsii_assembly__"); code.line(`__jsii_assembly__ = _runtime.JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); } @@ -126,6 +135,10 @@ class Module { (code as any)[methodName](...args); } + + // Whatever names we've exported, we'll write out our __all__ that lists them. + const stringifiedExportedNames = this.exportedNames.sort().map(s => `"${s}"`); + code.line(`__all__ = [${stringifiedExportedNames.join(", ")}]`); } private generateImportFrom(from: string, names: string[]): string { @@ -198,6 +211,7 @@ class PythonGenerator extends Generator { // TODO: Figure out what to do with abstract here. abstract; + this.currentModule().exportName(cls.name); this.currentModule().openBlock(`class ${cls.name}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); } From 15546d74f4aa30b55cbfca616feef9bd4814eb32 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 13:18:30 -0400 Subject: [PATCH 011/117] Add support for more types --- packages/jsii-pacmak/lib/targets/python.ts | 100 +++++++++++++++++++-- 1 file changed, 93 insertions(+), 7 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index c1e684c867..9ec60c40d2 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -34,6 +34,9 @@ const debug = function(o: any) { } +const PYTHON_BUILTIN_TYPES = ["bool", "str", "None"] + + class Module { readonly name: string; @@ -42,6 +45,7 @@ class Module { private buffer: object[]; private exportedNames: string[]; + private importedModules: string[]; constructor(ns: string, assembly?: [spec.Assembly, string]) { this.name = ns; @@ -53,6 +57,7 @@ class Module { this.buffer = []; this.exportedNames = []; + this.importedModules = []; } // Adds a name to the list of names that this module will export, this will control @@ -61,6 +66,38 @@ class Module { this.exportedNames.push(name); } + // Adds a name to the list of modules that should be imported at the top of this + // file. + public importModule(name: string) { + this.importedModules.push(name); + } + + public maybeImportType(type: string) { + if (PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { + // For built in types, we don't need to do anything, and can just return now + return; + } + + const [, typeModule] = type.match(/(.*)\.(.*)/) as any[]; + + // Given a name like foo.bar.Frob, we want to import the module that Frob exists + // in. Given that all classes exported by JSII have to be pascal cased, and all + // of our imports are snake cases, this should be safe. We're going to double + // check this though, to ensure that our importable here is safe. + if (typeModule != typeModule.toLowerCase()) { + // If we ever get to this point, we'll need to implment aliasing for our + // imports. + throw new Error("Type module is not lower case.") + } + + // We only want to actually import the type for this module, if it isn't the + // module that we're currently in, otherwise we'll jus rely on the module scope + // to make the name available to us. + if (typeModule != this.name) { + this.importModule(typeModule); + } + } + // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot // Operate on more than one file at a time, so we have to buffer our calls to // CodeMaker, otherwise we can end up in inconsistent state when we get things like: @@ -121,6 +158,15 @@ class Module { ) ) + // Go over all of the modules that we need to import, and import them. + for (let [idx, modName] of this.importedModules.sort().entries()) { + if (idx == 0) { + code.line(); + } + + code.line(`import ${modName}`); + } + // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { this.exportName("__jsii_assembly__"); @@ -253,8 +299,12 @@ class PythonGenerator extends Generator { } private emitPythonMethod(name?: string, implicitParam?: string, params: spec.Parameter[] = [], returns?: spec.TypeReference) { + let module = this.currentModule(); + // TODO: Handle imports (if needed) for type. const returnType = returns ? this.toPythonType(returns) : "None"; + module.maybeImportType(returnType); + // We need to turn a list of JSII parameters, into Python style arguments with // gradual typing, so we'll have to iterate over the list of parameters, and @@ -263,12 +313,12 @@ class PythonGenerator extends Generator { let pythonParams: string[] = implicitParam ? [implicitParam] : []; for (let param of params) { - pythonParams.push(`${param.name}: ${this.toPythonType(param.type)}`); + let paramType = this.toPythonType(param.type); + module.maybeImportType(paramType); + pythonParams.push(`${param.name}: ${this.formatPythonType(paramType)}`); } - let module = this.currentModule(); - - module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${returnType}`); + module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${this.formatPythonType(returnType)}`); module.line("..."); module.closeBlock(); } @@ -279,7 +329,7 @@ class PythonGenerator extends Generator { } else if (spec.isNamedTypeReference(typeref)) { // TODO: We need to actually handle this, isntead of just returning the FQN // as a string. - return `"${typeref.fqn}"`; + return this.toPythonFQN(typeref.fqn); } else { throw new Error("Invalid type reference: " + JSON.stringify(typeref)); } @@ -320,13 +370,49 @@ class PythonGenerator extends Generator { private toPythonPrimitive(primitive: spec.PrimitiveType): string { switch (primitive) { - case spec.PrimitiveType.String: - return "str"; + case spec.PrimitiveType.Boolean: return "bool"; + case spec.PrimitiveType.Date: return "dateetime.datetime"; + case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; + case spec.PrimitiveType.Number: return "numbers.Number"; + case spec.PrimitiveType.String: return "str"; + case spec.PrimitiveType.Any: return "typing.Any"; default: throw new Error("Unknown primitive type: " + primitive); } } + private toPythonFQN(name: string): string { + return name.split(".").map((cur, idx, arr) => { + if (idx == arr.length - 1) { + return cur; + } else { + return this.toPythonModuleName(cur); + } + }).join("."); + } + + private formatPythonType(type: string) { + // Built in types do not need formatted in any particular way. + if(PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { + return type; + } + + const [, typeModule, typeName] = type.match(/(.*)\.(.*)/) as any[]; + + // Types whose module is different than our current module, can also just be + // formatted as they are. + if (this.currentModule().name != typeModule) { + return type; + } + + // Otherwise, this is a type that exists in this module, and we can jsut emit + // the name. + // TODO: We currently emit this as a string, because that's how forward + // references used to work prior to 3.7. Ideally we will move to using 3.7 + // and can just use native forward references. + return `"${typeName}"`; + } + private currentModule(): Module { return this.moduleStack.slice(-1)[0]; } From 6b1cbd61fe7d69dab7871fe235f4a1020e387557 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 13:37:18 -0400 Subject: [PATCH 012/117] Fix some MyPy errors --- packages/jsii-python-runtime/src/jsii/_compat.py | 7 +++++-- packages/jsii-python-runtime/src/jsii/_kernel/__init__.py | 2 +- packages/jsii-python-runtime/src/jsii/_kernel/types.py | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_compat.py b/packages/jsii-python-runtime/src/jsii/_compat.py index 0d2cfa5e96..5a50288ef0 100644 --- a/packages/jsii-python-runtime/src/jsii/_compat.py +++ b/packages/jsii-python-runtime/src/jsii/_compat.py @@ -1,6 +1,9 @@ -try: +import sys + + +if sys.version_info >= (3, 7): import importlib.resources as importlib_resources -except ImportError: +else: import importlib_resources diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index b61868ac66..4bf1270923 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -87,7 +87,7 @@ def sget(self, klass: Any, property: str) -> Any: ).value def sset(self, klass: Any, property: str, value: Any) -> None: - return self.provider.sset( + self.provider.sset( StaticSetRequest(fqn=klass.__jsii_type__, property_=property, value=value) ) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index e58f2a84a2..095153ac8c 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -42,8 +42,8 @@ class LoadResponse: class CreateRequest: fqn: str - args: Optional[List[Any]] = attr.Factory(list) - overrides: Optional[List[Override]] = attr.Factory(list) + args: List[Any] = attr.Factory(list) + overrides: List[Override] = attr.Factory(list) @attr.s(auto_attribs=True, frozen=True, slots=True) From 882e5c70b32d0c6da478305a4085d8822b41bb39 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 15:11:21 -0400 Subject: [PATCH 013/117] Generate actual Python packages --- packages/jsii-pacmak/lib/targets/python.ts | 48 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 9ec60c40d2..be1cdab211 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -22,7 +22,9 @@ export default class Python extends Target { // this here is easy. await shell("black", ["--py36", sourceDir], {}); - return this.copyFiles(sourceDir, outDir); + // Actually package up our code, both as a sdist and a wheel for publishing. + await shell("python", ["setup.py", "sdist", "--dist-dir", outDir], { cwd: sourceDir }); + await shell("python", ["setup.py", "bdist_wheel", "--dist-dir", outDir], { cwd: sourceDir }); } } @@ -225,6 +227,46 @@ class PythonGenerator extends Generator { this.code.closeFile(assemblyInitFilename); } + protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { + debug("onEndAssembly"); + debug(assm); + + // We need to write out our packaging for the Python ecosystem here. + // TODO: + // - Author + // - README + // - License + // - Classifiers + // - install_requires + this.code.openFile("setup.py"); + this.code.line("import setuptools"); + this.code.indent("setuptools.setup("); + this.code.line(`name="${assm.name}",`); + this.code.line(`version="${assm.version}",`); + this.code.line(`description="${assm.description}",`); + this.code.line(`url="${assm.homepage}",`); + this.code.line('package_dir={"": "src"},'); + this.code.line('packages=setuptools.find_packages(where="src"),'); + this.code.line(`package_data={"${this.toPythonModuleName(assm.name)}._jsii": ["*.jsii.tgz"]},`); + this.code.line('python_requires=">=3.6",'); + this.code.unindent(")"); + this.code.closeFile("setup.py"); + + // Because we're good citizens, we're going to go ahead and support pyproject.toml + // as well. + // TODO: Might be easier to just use a TOML library to write this out. + this.code.openFile("pyproject.toml"); + this.code.line("[build-system]"); + this.code.line('requires = ["setuptools", "wheel"]'); + this.code.closeFile("pyproject.toml"); + + // We also need to write out a MANIFEST.in to ensure that all of our required + // files are included. + this.code.openFile("MANIFEST.in") + this.code.line("include pyproject.toml") + this.code.closeFile("MANIFEST.in") + } + protected onBeginNamespace(ns: string) { debug(`onBeginNamespace: ${ns}`); @@ -427,10 +469,6 @@ class PythonGenerator extends Generator { // Not Currently Used - protected onEndAssembly(_assm: spec.Assembly, _fingerprint: boolean) { - debug("onEndAssembly"); - } - protected onBeginInterface(_ifc: spec.InterfaceType) { debug("onBeginInterface"); } From 0e34a80842a2eae8a10c10f4f997c771a16c366b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 15:11:36 -0400 Subject: [PATCH 014/117] Correct the name of the import JSIIAssembly --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index be1cdab211..61d4bd2634 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -172,7 +172,7 @@ class Module { // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { this.exportName("__jsii_assembly__"); - code.line(`__jsii_assembly__ = _runtime.JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); + code.line(`__jsii_assembly__ = _JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); } // Now that we've gotten all of the module header stuff done, we need to go From 5ea945de40b6110fa02f275a3442ea5bb0f24d11 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 19:01:19 -0400 Subject: [PATCH 015/117] Produce packages for the JSII Python Runtime --- .gitignore | 7 +++++++ packages/jsii-build-tools/bin/package-python | 7 +++++++ packages/jsii-build-tools/package.json | 3 ++- packages/jsii-python-runtime/.gitignore | 1 + packages/jsii-python-runtime/MANIFEST.in | 2 ++ packages/jsii-python-runtime/bin/generate | 9 +++++++++ packages/jsii-python-runtime/package.json | 5 ++++- packages/jsii-python-runtime/pyproject.toml | 2 ++ packages/jsii-python-runtime/setup.py | 21 ++++++++++++++++++++ 9 files changed, 55 insertions(+), 2 deletions(-) create mode 100755 packages/jsii-build-tools/bin/package-python create mode 100644 packages/jsii-python-runtime/.gitignore create mode 100644 packages/jsii-python-runtime/MANIFEST.in create mode 100755 packages/jsii-python-runtime/bin/generate create mode 100644 packages/jsii-python-runtime/pyproject.toml create mode 100644 packages/jsii-python-runtime/setup.py diff --git a/.gitignore b/.gitignore index b7615a96eb..6042ea8813 100644 --- a/.gitignore +++ b/.gitignore @@ -368,3 +368,10 @@ jspm_packages/ # that NuGet uses for external packages. We don't want to ignore the # lerna packages. !/packages/* + + +# Python packages generate this while building them. +*.egg-info + +# MyPy cache +.mypy_cache/ diff --git a/packages/jsii-build-tools/bin/package-python b/packages/jsii-build-tools/bin/package-python new file mode 100755 index 0000000000..8ea2d10df6 --- /dev/null +++ b/packages/jsii-build-tools/bin/package-python @@ -0,0 +1,7 @@ +#!/bin/bash +set -euo pipefail + +rm -rf dist/python +mkdir -p dist/python +mv *.whl dist/python +mv *.tar.gz dist/python diff --git a/packages/jsii-build-tools/package.json b/packages/jsii-build-tools/package.json index a50346cb96..7085182067 100644 --- a/packages/jsii-build-tools/package.json +++ b/packages/jsii-build-tools/package.json @@ -8,7 +8,8 @@ "package-js": "bin/package-js", "package-java": "bin/package-java", "package-dotnet": "bin/package-dotnet", - "package-ruby": "bin/package-ruby" + "package-ruby": "bin/package-ruby", + "package-python": "bin/package-python" }, "scripts": { "build": "chmod +x bin/*" diff --git a/packages/jsii-python-runtime/.gitignore b/packages/jsii-python-runtime/.gitignore new file mode 100644 index 0000000000..21719fccd5 --- /dev/null +++ b/packages/jsii-python-runtime/.gitignore @@ -0,0 +1 @@ +src/jsii/_metadata.json diff --git a/packages/jsii-python-runtime/MANIFEST.in b/packages/jsii-python-runtime/MANIFEST.in new file mode 100644 index 0000000000..8ab5288007 --- /dev/null +++ b/packages/jsii-python-runtime/MANIFEST.in @@ -0,0 +1,2 @@ +include pyproject.toml +include src/jsii/_metadata.json diff --git a/packages/jsii-python-runtime/bin/generate b/packages/jsii-python-runtime/bin/generate new file mode 100755 index 0000000000..07e029f998 --- /dev/null +++ b/packages/jsii-python-runtime/bin/generate @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +import json + +with open("package.json") as fp: + data = json.load(fp) + + +with open("src/jsii/_metadata.json", "w") as fp: + json.dump({"version": data["version"]}, fp) diff --git a/packages/jsii-python-runtime/package.json b/packages/jsii-python-runtime/package.json index 69f6b2eaa9..d99b992e6f 100644 --- a/packages/jsii-python-runtime/package.json +++ b/packages/jsii-python-runtime/package.json @@ -4,11 +4,14 @@ "description": "Python client for jsii runtime", "main": "index.js", "scripts": { - "build": "echo ok", + "generate": "bin/generate", + "build": "npm run generate && python setup.py sdist -d . bdist_wheel -d . && rm -rf build", + "package": "package-python", "prepack": "echo ok", "test": "echo ok" }, "dependencies": { + "jsii-build-tools": "^0.7.4", "jsii-runtime": "^0.7.1" }, "repository": { diff --git a/packages/jsii-python-runtime/pyproject.toml b/packages/jsii-python-runtime/pyproject.toml new file mode 100644 index 0000000000..d1e6ae6e56 --- /dev/null +++ b/packages/jsii-python-runtime/pyproject.toml @@ -0,0 +1,2 @@ +[build-system] +requires = ["setuptools", "wheel"] diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py new file mode 100644 index 0000000000..96eb147875 --- /dev/null +++ b/packages/jsii-python-runtime/setup.py @@ -0,0 +1,21 @@ +import json +import setuptools + + +with open("src/jsii/_metadata.json") as fp: + metadata = json.load(fp) + + +setuptools.setup( + name="jsii", + version=metadata["version"], + package_dir={"": "src"}, + packages=setuptools.find_packages(where="src"), + package_data={"jsii": ["_metadata.json"]}, + install_requires=[ + "attrs", + "cattrs", + "importlib_resources ; python_version < '3.7'", + ], + python_requires=">=3.6", +) From 82759444033df18dcabf73b04265a8f6253b7adf Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 21 Sep 2018 19:49:07 -0400 Subject: [PATCH 016/117] Embed the jsii-runtime within the jsii-python-runtime --- packages/jsii-python-runtime/.gitignore | 1 + packages/jsii-python-runtime/bin/generate | 14 ++++- packages/jsii-python-runtime/setup.py | 5 +- .../src/jsii/_embedded/__init__.py | 0 .../src/jsii/_embedded/jsii/__init__.py | 0 .../src/jsii/_kernel/providers/process.py | 58 ++++++++++++++++++- 6 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 packages/jsii-python-runtime/src/jsii/_embedded/__init__.py create mode 100644 packages/jsii-python-runtime/src/jsii/_embedded/jsii/__init__.py diff --git a/packages/jsii-python-runtime/.gitignore b/packages/jsii-python-runtime/.gitignore index 21719fccd5..4c8711ebb6 100644 --- a/packages/jsii-python-runtime/.gitignore +++ b/packages/jsii-python-runtime/.gitignore @@ -1 +1,2 @@ +src/jsii/_embedded src/jsii/_metadata.json diff --git a/packages/jsii-python-runtime/bin/generate b/packages/jsii-python-runtime/bin/generate index 07e029f998..cc901c3bf8 100755 --- a/packages/jsii-python-runtime/bin/generate +++ b/packages/jsii-python-runtime/bin/generate @@ -1,9 +1,21 @@ #!/usr/bin/env python3 import json +import os +import os.path +import shutil +EMBEDDED_SOURCE = "node_modules/jsii-runtime/webpack/" + + +# Copy metadata over into the Python package with open("package.json") as fp: data = json.load(fp) - with open("src/jsii/_metadata.json", "w") as fp: json.dump({"version": data["version"]}, fp) + + +# Embed the JSII runtime into the Python Package. +for filename in os.listdir(EMBEDDED_SOURCE): + filepath = os.path.join(EMBEDDED_SOURCE, filename) + shutil.copy2(filepath, "src/jsii/_embedded/jsii") diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py index 96eb147875..dd45451e06 100644 --- a/packages/jsii-python-runtime/setup.py +++ b/packages/jsii-python-runtime/setup.py @@ -11,7 +11,10 @@ version=metadata["version"], package_dir={"": "src"}, packages=setuptools.find_packages(where="src"), - package_data={"jsii": ["_metadata.json"]}, + package_data={ + "jsii": ["_metadata.json"], + "jsii._embedded.jsii": ["*.js", "*.js.map", "*.wasm"], + }, install_requires=[ "attrs", "cattrs", diff --git a/packages/jsii-python-runtime/src/jsii/_embedded/__init__.py b/packages/jsii-python-runtime/src/jsii/_embedded/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/jsii-python-runtime/src/jsii/_embedded/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/_embedded/jsii/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 7bae4e4144..11d7fe62c3 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -1,11 +1,18 @@ +import contextlib +import importlib.machinery import json +import os.path import subprocess +import tempfile from typing import Type, Union, Mapping, Any, Optional import attr import cattr # type: ignore +import jsii._embedded.jsii + +from jsii._compat import importlib_resources from jsii._utils import memoized_property from jsii._kernel.providers.base import BaseKernel from jsii._kernel.types import ( @@ -129,15 +136,62 @@ def __init__(self): self._serializer.register_unstructure_hook(ObjRef, _unstructure_ref) self._serializer.register_structure_hook(ObjRef, _with_reference) + self._ctx_stack = contextlib.ExitStack() + def __del__(self): self.stop() + def _jsii_runtime(self): + # We have the JSII Runtime bundled with our package and we want to extract it, + # however if we just blindly use importlib.resources for this, we're going to + # have our jsii-runtime.js existing in a *different* temporary directory from + # the jsii-runtime.js.map, which we don't want. We can manually set up a + # temporary directory and extract our resources to there, but we don't want to + # pay the case of setting up a a temporary directory and shuffling bytes around + # in the common case where these files already exist on disk side by side. So + # we will check what loader the embedded package used, if it's a + # SourceFileLoader then we'll assume it's going to be on the filesystem and + # just use importlib.resources.path. + + # jsii-runtime.js MUST be the first item in this list. + filenames = ["jsii-runtime.js", "jsii-runtime.js.map", "mappings.wasm"] + + if isinstance( + jsii._embedded.jsii.__loader__, importlib.machinery.SourceFileLoader + ): + paths = [ + self._ctx_stack.enter_context( + importlib_resources.path(jsii._embedded.jsii, f) + ) + for f in filenames + ] + else: + tmpdir = self._ctx_stack.enter_context(tempfile.TemporaryDirectory()) + paths = [os.path.join(tmpdir, filename) for filename in filenames] + + for path, filename in zip(paths, filenames): + with open(path, "wb") as fp: + fp.write( + importlib_resources.read_binary(jsii._embedded.jsii, filename) + ) + + # Ensure that our jsii-runtime.js is the first entry in our paths, and that all + # of our paths, are in a commmon directory, and we didn't get them split into + # multiple directories somehow. + assert os.path.basename(paths[0]) == filenames[0] + assert os.path.commonpath(paths) == os.path.dirname(paths[0]) + + # Return our first path, which should be the path for jsii-runtime.js + return paths[0] + def _next_message(self) -> Mapping[Any, Any]: return json.loads(self._process.stdout.readline(), object_hook=ohook) def start(self): self._process = subprocess.Popen( - "jsii-runtime", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ["node", self._jsii_runtime()], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, ) self.handshake() @@ -150,6 +204,8 @@ def stop(self): except subprocess.TimeoutExpired: self._process.kill() + self._ctx_stack.close() + def handshake(self): resp: _HelloResponse = self._serializer.structure( self._next_message(), _HelloResponse From 21f7ecb9bb5ea1085fa8885afc4bb1a0b0fc9e7e Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 27 Sep 2018 20:16:26 -0400 Subject: [PATCH 017/117] Handle collection types in JSII --- packages/jsii-pacmak/lib/targets/python.ts | 73 +++++++++++++--------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 61d4bd2634..6983f8fda7 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -75,28 +75,44 @@ class Module { } public maybeImportType(type: string) { - if (PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { - // For built in types, we don't need to do anything, and can just return now - return; - } + let types: string[] = []; - const [, typeModule] = type.match(/(.*)\.(.*)/) as any[]; + // Before we do anything else, we need to split apart any collections, these + // always have the syntax of something[something, maybesomething], so we'll + // check for [] first. + if (type.match(/[^\[]*\[.+\]/)) { + const [, genericType, innerTypes] = type.match(/([^\[]*)\[(.+)\]/) as any[]; - // Given a name like foo.bar.Frob, we want to import the module that Frob exists - // in. Given that all classes exported by JSII have to be pascal cased, and all - // of our imports are snake cases, this should be safe. We're going to double - // check this though, to ensure that our importable here is safe. - if (typeModule != typeModule.toLowerCase()) { - // If we ever get to this point, we'll need to implment aliasing for our - // imports. - throw new Error("Type module is not lower case.") + types.push(genericType); + types.push(...innerTypes.split(",")); + } else { + types.push(type); } - // We only want to actually import the type for this module, if it isn't the - // module that we're currently in, otherwise we'll jus rely on the module scope - // to make the name available to us. - if (typeModule != this.name) { - this.importModule(typeModule); + // Loop over all of the types we've discovered, and check them for being + // importable + for (let type of types) { + // For built in types, we don't need to do anything, and can just move on. + if (PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { continue; } + + let [, typeModule] = type.match(/(.*)\.(.*)/) as any[]; + + // Given a name like foo.bar.Frob, we want to import the module that Frob exists + // in. Given that all classes exported by JSII have to be pascal cased, and all + // of our imports are snake cases, this should be safe. We're going to double + // check this though, to ensure that our importable here is safe. + if (typeModule != typeModule.toLowerCase()) { + // If we ever get to this point, we'll need to implment aliasing for our + // imports. + throw new Error(`Type module is not lower case: '${typeModule}'`); + } + + // We only want to actually import the type for this module, if it isn't the + // module that we're currently in, otherwise we'll jus rely on the module scope + // to make the name available to us. + if (typeModule != this.name) { + this.importModule(typeModule); + } } } @@ -368,9 +384,9 @@ class PythonGenerator extends Generator { private toPythonType(typeref: spec.TypeReference): string { if (spec.isPrimitiveTypeReference(typeref)) { return this.toPythonPrimitive(typeref.primitive); + } else if (spec.isCollectionTypeReference(typeref)) { + return this.toPythonCollection(typeref); } else if (spec.isNamedTypeReference(typeref)) { - // TODO: We need to actually handle this, isntead of just returning the FQN - // as a string. return this.toPythonFQN(typeref.fqn); } else { throw new Error("Invalid type reference: " + JSON.stringify(typeref)); @@ -395,19 +411,16 @@ class PythonGenerator extends Generator { throw new Error('Invalid type reference: ' + JSON.stringify(typeref)); } */ + } - /* - switch (primitive) { - case spec.PrimitiveType.Boolean: return 'java.lang.Boolean'; - case spec.PrimitiveType.Date: return 'java.time.Instant'; - case spec.PrimitiveType.Json: return 'com.fasterxml.jackson.databind.node.ObjectNode'; - case spec.PrimitiveType.Number: return 'java.lang.Number'; - case spec.PrimitiveType.String: return 'java.lang.String'; - case spec.PrimitiveType.Any: return 'java.lang.Object'; + private toPythonCollection(ref: spec.CollectionTypeReference) { + const elementPythonType = this.toPythonType(ref.collection.elementtype); + switch (ref.collection.kind) { + case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; + case spec.CollectionKind.Map: return `typing.Mapping[str,${elementPythonType}]`; default: - throw new Error('Unknown primitive type: ' + primitive); + throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); } - */ } private toPythonPrimitive(primitive: spec.PrimitiveType): string { From e2708e0e412171c1f46ef460d0adb92fcc059191 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 27 Sep 2018 20:29:36 -0400 Subject: [PATCH 018/117] Handle scoped packages --- packages/jsii-pacmak/lib/targets/python.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 6983f8fda7..b7a360e71a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -473,11 +473,25 @@ class PythonGenerator extends Generator { } private toPythonModuleName(name: string): string { - return this.code.toSnakeCase(name.replace(/-/g, "_")); + if (name.match(/^@[^/]+\/[^/]+$/)) { + name = name.replace(/^@/g, ""); + name = name.replace(/\//g, "."); + } + + name = this.code.toSnakeCase(name.replace(/-/g, "_")); + + return name; } private toPythonModuleFilename(name: string): string { - return name.replace(/\./g, "/"); + if (name.match(/^@[^/]+\/[^/]+$/)) { + name = name.replace(/^@/g, ""); + name = name.replace(/\//g, "."); + } + + name = name.replace(/\./g, "/"); + + return name; } // Not Currently Used From 340f8e9c3a0a4f4af1bd69402df1ea759c705473 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 27 Sep 2018 20:39:01 -0400 Subject: [PATCH 019/117] Handle the case where a JSII name conflicts with a Python keyword --- packages/jsii-pacmak/lib/targets/python.ts | 47 ++++++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index b7a360e71a..3ab0786e4a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -38,6 +38,13 @@ const debug = function(o: any) { const PYTHON_BUILTIN_TYPES = ["bool", "str", "None"] +const PYTHON_KEYWORDS = [ + "False", "None", "True", "and", "as", "assert", "async", "await", "break", "class", + "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", + "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", + "raise", "return", "try", "while", "with", "yield" +] + class Module { @@ -312,11 +319,13 @@ class PythonGenerator extends Generator { protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { debug("onBeginClass"); + const clsName = this.toPythonIdentifier(cls.name); + // TODO: Figure out what to do with abstract here. abstract; - this.currentModule().exportName(cls.name); - this.currentModule().openBlock(`class ${cls.name}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); + this.currentModule().exportName(clsName); + this.currentModule().openBlock(`class ${clsName}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); } protected onEndClass(_cls: spec.ClassType) { @@ -329,31 +338,42 @@ class PythonGenerator extends Generator { debug("onStaticMethod"); // TODO: Handle the case where the Python name and the JSII name differ. + const methodName = this.toPythonIdentifier(method.name!); + this.currentModule().line("@_jsii_classmethod"); - this.emitPythonMethod(method.name, "cls", method.parameters, method.returns); + this.emitPythonMethod(methodName, "cls", method.parameters, method.returns); } protected onMethod(_cls: spec.ClassType, method: spec.Method) { debug("onMethod"); + // TODO: Handle the case where the Python name and the JSII name differ. + const methodName = this.toPythonIdentifier(method.name!); + this.currentModule().line("@_jsii_method"); - this.emitPythonMethod(method.name, "self", method.parameters, method.returns); + this.emitPythonMethod(methodName, "self", method.parameters, method.returns); } protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { debug("onStaticProperty"); + // TODO: Handle the case where the Python name and the JSII name differ. + const propertyName = this.toPythonIdentifier(prop.name!); + // TODO: Properties have a bunch of states, they can have getters and setters // we need to better handle all of these cases. this.currentModule().line("@_jsii_classproperty"); - this.emitPythonMethod(prop.name, "self", [], prop.type); + this.emitPythonMethod(propertyName, "self", [], prop.type); } protected onProperty(_cls: spec.ClassType, prop: spec.Property) { debug("onProperty"); + // TODO: Handle the case where the Python name and the JSII name differ. + const propertyName = this.toPythonIdentifier(prop.name!); + this.currentModule().line("@_jsii_property"); - this.emitPythonMethod(prop.name, "self", [], prop.type); + this.emitPythonMethod(propertyName, "self", [], prop.type); } private emitPythonMethod(name?: string, implicitParam?: string, params: spec.Parameter[] = [], returns?: spec.TypeReference) { @@ -371,9 +391,12 @@ class PythonGenerator extends Generator { let pythonParams: string[] = implicitParam ? [implicitParam] : []; for (let param of params) { + let paramName = this.toPythonIdentifier(param.name); let paramType = this.toPythonType(param.type); + module.maybeImportType(paramType); - pythonParams.push(`${param.name}: ${this.formatPythonType(paramType)}`); + + pythonParams.push(`${paramName}: ${this.formatPythonType(paramType)}`); } module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${this.formatPythonType(returnType)}`); @@ -381,6 +404,14 @@ class PythonGenerator extends Generator { module.closeBlock(); } + private toPythonIdentifier(name: string): string { + if (PYTHON_KEYWORDS.indexOf(name) > -1) { + return name + "_"; + } + + return name; + } + private toPythonType(typeref: spec.TypeReference): string { if (spec.isPrimitiveTypeReference(typeref)) { return this.toPythonPrimitive(typeref.primitive); @@ -439,7 +470,7 @@ class PythonGenerator extends Generator { private toPythonFQN(name: string): string { return name.split(".").map((cur, idx, arr) => { if (idx == arr.length - 1) { - return cur; + return this.toPythonIdentifier(cur); } else { return this.toPythonModuleName(cur); } From ea14b3cbed001cd78cab6584847516cd23454091 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 27 Sep 2018 23:35:04 -0400 Subject: [PATCH 020/117] Work with PEP 420 style namespace pacages --- packages/jsii-pacmak/lib/targets/python.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 3ab0786e4a..9db0942cf4 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -224,6 +224,7 @@ class Module { class PythonGenerator extends Generator { + private modules: Module[]; private moduleStack: Module[]; constructor(options = new GeneratorOptions()) { @@ -232,6 +233,7 @@ class PythonGenerator extends Generator { this.code.openBlockFormatter = s => `${s}:`; this.code.closeBlockFormatter = _s => ""; + this.modules = []; this.moduleStack = []; } @@ -252,7 +254,9 @@ class PythonGenerator extends Generator { protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { debug("onEndAssembly"); - debug(assm); + + const packageName = this.toPythonPackageName(assm.name); + const moduleNames = this.modules.map(m => m.name); // We need to write out our packaging for the Python ecosystem here. // TODO: @@ -264,12 +268,12 @@ class PythonGenerator extends Generator { this.code.openFile("setup.py"); this.code.line("import setuptools"); this.code.indent("setuptools.setup("); - this.code.line(`name="${assm.name}",`); + this.code.line(`name="${packageName}",`); this.code.line(`version="${assm.version}",`); this.code.line(`description="${assm.description}",`); this.code.line(`url="${assm.homepage}",`); this.code.line('package_dir={"": "src"},'); - this.code.line('packages=setuptools.find_packages(where="src"),'); + this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`) this.code.line(`package_data={"${this.toPythonModuleName(assm.name)}._jsii": ["*.jsii.tgz"]},`); this.code.line('python_requires=">=3.6",'); this.code.unindent(")"); @@ -302,7 +306,10 @@ class PythonGenerator extends Generator { moduleArgs.push([this.assembly, this.getAssemblyFileName()]); } - this.moduleStack.push(new Module(moduleName, ...moduleArgs)); + let mod = new Module(moduleName, ...moduleArgs); + + this.modules.push(mod); + this.moduleStack.push(mod); } protected onEndNamespace(ns: string) { @@ -404,6 +411,10 @@ class PythonGenerator extends Generator { module.closeBlock(); } + private toPythonPackageName(name: string): string { + return this.toPythonModuleName(name).replace(/_/g, "-"); + } + private toPythonIdentifier(name: string): string { if (PYTHON_KEYWORDS.indexOf(name) > -1) { return name + "_"; From 2f930776458fabd07178a185680825e6fedf3bc5 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 27 Sep 2018 23:58:53 -0400 Subject: [PATCH 021/117] Deduplicate imports --- packages/jsii-pacmak/lib/targets/python.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 9db0942cf4..5327fbadf1 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -78,7 +78,9 @@ class Module { // Adds a name to the list of modules that should be imported at the top of this // file. public importModule(name: string) { - this.importedModules.push(name); + if (!this.importedModules.includes(name)) { + this.importedModules.push(name); + } } public maybeImportType(type: string) { @@ -90,10 +92,10 @@ class Module { if (type.match(/[^\[]*\[.+\]/)) { const [, genericType, innerTypes] = type.match(/([^\[]*)\[(.+)\]/) as any[]; - types.push(genericType); - types.push(...innerTypes.split(",")); + types.push(genericType.trim()); + types.push(...innerTypes.split(",").map((s: string) => s.trim())); } else { - types.push(type); + types.push(type.trim()); } // Loop over all of the types we've discovered, and check them for being From 9d6362f31a36246c644e9c01412a44df06e26648 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 00:02:04 -0400 Subject: [PATCH 022/117] Remove some debug output --- packages/jsii-pacmak/lib/targets/python.ts | 30 +++++++--------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 5327fbadf1..3c47d489c2 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -244,8 +244,6 @@ class PythonGenerator extends Generator { } protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { - debug("onBeginAssembly"); - // We need to write out an __init__.py for our _jsii package so that // importlib.resources will be able to load our assembly from it. const assemblyInitFilename = path.join(this.getAssemblyOutputDir(assm), "__init__.py"); @@ -255,8 +253,6 @@ class PythonGenerator extends Generator { } protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { - debug("onEndAssembly"); - const packageName = this.toPythonPackageName(assm.name); const moduleNames = this.modules.map(m => m.name); @@ -297,8 +293,6 @@ class PythonGenerator extends Generator { } protected onBeginNamespace(ns: string) { - debug(`onBeginNamespace: ${ns}`); - const moduleName = this.toPythonModuleName(ns); const loadAssembly = this.assembly.name == ns ? true : false; @@ -314,9 +308,7 @@ class PythonGenerator extends Generator { this.moduleStack.push(mod); } - protected onEndNamespace(ns: string) { - debug(`onEndNamespace: ${ns}`); - + protected onEndNamespace(_ns: string) { let module = this.moduleStack.pop() as Module; let moduleFilename = path.join("src", this.toPythonModuleFilename(module.name), "__init__.py"); @@ -326,8 +318,6 @@ class PythonGenerator extends Generator { } protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { - debug("onBeginClass"); - const clsName = this.toPythonIdentifier(cls.name); // TODO: Figure out what to do with abstract here. @@ -338,14 +328,10 @@ class PythonGenerator extends Generator { } protected onEndClass(_cls: spec.ClassType) { - debug("onEndClass"); - this.currentModule().closeBlock(); } protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { - debug("onStaticMethod"); - // TODO: Handle the case where the Python name and the JSII name differ. const methodName = this.toPythonIdentifier(method.name!); @@ -354,8 +340,6 @@ class PythonGenerator extends Generator { } protected onMethod(_cls: spec.ClassType, method: spec.Method) { - debug("onMethod"); - // TODO: Handle the case where the Python name and the JSII name differ. const methodName = this.toPythonIdentifier(method.name!); @@ -364,8 +348,6 @@ class PythonGenerator extends Generator { } protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { - debug("onStaticProperty"); - // TODO: Handle the case where the Python name and the JSII name differ. const propertyName = this.toPythonIdentifier(prop.name!); @@ -376,8 +358,6 @@ class PythonGenerator extends Generator { } protected onProperty(_cls: spec.ClassType, prop: spec.Property) { - debug("onProperty"); - // TODO: Handle the case where the Python name and the JSII name differ. const propertyName = this.toPythonIdentifier(prop.name!); @@ -542,33 +522,41 @@ class PythonGenerator extends Generator { protected onBeginInterface(_ifc: spec.InterfaceType) { debug("onBeginInterface"); + throw new Error("Unhandled Type: Interface"); } protected onEndInterface(_ifc: spec.InterfaceType) { debug("onEndInterface"); + throw new Error("Unhandled Type: Interface"); } protected onInterfaceMethod(_ifc: spec.InterfaceType, _method: spec.Method) { debug("onInterfaceMethod"); + throw new Error("Unhandled Type: InterfaceMethod"); } protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { debug("onInterfaceMethodOverload"); + throw new Error("Unhandled Type: InterfaceMethodOverload"); } protected onInterfaceProperty(_ifc: spec.InterfaceType, _prop: spec.Property) { debug("onInterfaceProperty"); + throw new Error("Unhandled Type: InterfaceProperty"); } protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { debug("onUnionProperty"); + throw new Error("Unhandled Type: UnionProperty"); } protected onMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { debug("onMethodOverload"); + throw new Error("Unhandled Type: MethodOverload"); } protected onStaticMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { debug("onStaticMethodOverload"); + throw new Error("Unhandled Type: StaticMethodOverload"); } } From 0cb0ad5a4189939461cd167bdec333a9d0ad5fb3 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 01:33:17 -0400 Subject: [PATCH 023/117] Add support for Union types --- packages/jsii-pacmak/lib/targets/python.ts | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 3c47d489c2..9df643c624 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -412,29 +412,15 @@ class PythonGenerator extends Generator { return this.toPythonCollection(typeref); } else if (spec.isNamedTypeReference(typeref)) { return this.toPythonFQN(typeref.fqn); - } else { - throw new Error("Invalid type reference: " + JSON.stringify(typeref)); - } - - /* - if (spec.isPrimitiveTypeReference(typeref)) { - return [ this.toJavaPrimitive(typeref.primitive) ]; - } else if (spec.isCollectionTypeReference(typeref)) { - return [ this.toJavaCollection(typeref, forMarshalling) ]; - } else if (spec.isNamedTypeReference(typeref)) { - return [ this.toNativeFqn(typeref.fqn) ]; } else if (typeref.union) { const types = new Array(); for (const subtype of typeref.union.types) { - for (const t of this.toJavaTypes(subtype, forMarshalling)) { - types.push(t); - } + types.push(this.toPythonType(subtype)); } - return types; + return `typing.Union[${types.join(", ")}]`; } else { - throw new Error('Invalid type reference: ' + JSON.stringify(typeref)); + throw new Error("Invalid type reference: " + JSON.stringify(typeref)); } - */ } private toPythonCollection(ref: spec.CollectionTypeReference) { From 90b8ebe0d406c4db329974ae5480e7796295e969 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 02:10:09 -0400 Subject: [PATCH 024/117] Add support for interfaces --- packages/jsii-pacmak/lib/targets/python.ts | 62 ++++++++++++------- packages/jsii-python-runtime/setup.py | 1 + .../jsii-python-runtime/src/jsii/_compat.py | 1 + .../jsii-python-runtime/src/jsii/compat.py | 6 ++ 4 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 packages/jsii-python-runtime/src/jsii/compat.py diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 9df643c624..2852b6e779 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -171,6 +171,7 @@ class Module { public write(code: CodeMaker) { // Before we do Anything, we need to write out our module headers, this is where // we handle stuff like imports, any required initialization, etc. + code.line(this.generateImportFrom("jsii.compat", ["Protocol"])); code.line( this.generateImportFrom( "jsii.runtime", @@ -183,7 +184,7 @@ class Module { "jsii_classproperty", ] ) - ) + ); // Go over all of the modules that we need to import, and import them. for (let [idx, modName] of this.importedModules.sort().entries()) { @@ -365,6 +366,41 @@ class PythonGenerator extends Generator { this.emitPythonMethod(propertyName, "self", [], prop.type); } + protected onBeginInterface(ifc: spec.InterfaceType) { + const currentModule = this.currentModule(); + const interfaceName = this.toPythonIdentifier(ifc.name); + + let interfaceBases: string[] = []; + for (let interfaceBase of (ifc.interfaces || [])) { + let interfaceBaseType = this.toPythonType(interfaceBase); + interfaceBases.push(this.formatPythonType(interfaceBaseType, true)); + currentModule.maybeImportType(interfaceBaseType); + } + interfaceBases.push("_Protocol"); + + // TODO: Data Type + + currentModule.exportName(interfaceName); + currentModule.openBlock(`class ${interfaceName}(${interfaceBases.join(",")})`); + } + + protected onEndInterface(_ifc: spec.InterfaceType) { + this.currentModule().closeBlock(); + } + + protected onInterfaceMethod(_ifc: spec.InterfaceType, method: spec.Method) { + const methodName = this.toPythonIdentifier(method.name!); + + this.emitPythonMethod(methodName, "self", method.parameters, method.returns); + } + + protected onInterfaceProperty(_ifc: spec.InterfaceType, prop: spec.Property) { + const propertyName = this.toPythonIdentifier(prop.name!); + + this.currentModule().line("@property"); + this.emitPythonMethod(propertyName, "self", [], prop.type); + } + private emitPythonMethod(name?: string, implicitParam?: string, params: spec.Parameter[] = [], returns?: spec.TypeReference) { let module = this.currentModule(); @@ -456,7 +492,7 @@ class PythonGenerator extends Generator { }).join("."); } - private formatPythonType(type: string) { + private formatPythonType(type: string, fowardReference: boolean = false) { // Built in types do not need formatted in any particular way. if(PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { return type; @@ -475,7 +511,7 @@ class PythonGenerator extends Generator { // TODO: We currently emit this as a string, because that's how forward // references used to work prior to 3.7. Ideally we will move to using 3.7 // and can just use native forward references. - return `"${typeName}"`; + return fowardReference ? typeName : `"${typeName}"`; } private currentModule(): Module { @@ -506,31 +542,11 @@ class PythonGenerator extends Generator { // Not Currently Used - protected onBeginInterface(_ifc: spec.InterfaceType) { - debug("onBeginInterface"); - throw new Error("Unhandled Type: Interface"); - } - - protected onEndInterface(_ifc: spec.InterfaceType) { - debug("onEndInterface"); - throw new Error("Unhandled Type: Interface"); - } - - protected onInterfaceMethod(_ifc: spec.InterfaceType, _method: spec.Method) { - debug("onInterfaceMethod"); - throw new Error("Unhandled Type: InterfaceMethod"); - } - protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { debug("onInterfaceMethodOverload"); throw new Error("Unhandled Type: InterfaceMethodOverload"); } - protected onInterfaceProperty(_ifc: spec.InterfaceType, _prop: spec.Property) { - debug("onInterfaceProperty"); - throw new Error("Unhandled Type: InterfaceProperty"); - } - protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { debug("onUnionProperty"); throw new Error("Unhandled Type: UnionProperty"); diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py index dd45451e06..03c115f664 100644 --- a/packages/jsii-python-runtime/setup.py +++ b/packages/jsii-python-runtime/setup.py @@ -19,6 +19,7 @@ "attrs", "cattrs", "importlib_resources ; python_version < '3.7'", + "typing_extensions>=3.6.4", ], python_requires=">=3.6", ) diff --git a/packages/jsii-python-runtime/src/jsii/_compat.py b/packages/jsii-python-runtime/src/jsii/_compat.py index 5a50288ef0..27798ed192 100644 --- a/packages/jsii-python-runtime/src/jsii/_compat.py +++ b/packages/jsii-python-runtime/src/jsii/_compat.py @@ -1,3 +1,4 @@ +# Internal Compatability Shims import sys diff --git a/packages/jsii-python-runtime/src/jsii/compat.py b/packages/jsii-python-runtime/src/jsii/compat.py new file mode 100644 index 0000000000..1c1e037c51 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/compat.py @@ -0,0 +1,6 @@ +# External Compatability Shims + +from typing_extensions import Protocol + + +__all__ = ["Protocol"] From 507f787b87c7cb93ac9fbb71eeba70c42168d54c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 21:55:00 -0400 Subject: [PATCH 025/117] Fix setup.py to always include JSII assembly --- packages/jsii-pacmak/lib/targets/python.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 2852b6e779..6d32f3f133 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -241,7 +241,7 @@ class PythonGenerator extends Generator { } protected getAssemblyOutputDir(mod: spec.Assembly) { - return path.join("src", this.toPythonModuleName(mod.name), "_jsii"); + return path.join("src", this.toPythonModuleFilename(this.toPythonModuleName(mod.name)), "_jsii"); } protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { @@ -255,8 +255,12 @@ class PythonGenerator extends Generator { protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { const packageName = this.toPythonPackageName(assm.name); + const topLevelModuleName = this.toPythonModuleName(packageName); const moduleNames = this.modules.map(m => m.name); + moduleNames.push(`${topLevelModuleName}._jsii`); + moduleNames.sort(); + // We need to write out our packaging for the Python ecosystem here. // TODO: // - Author @@ -273,7 +277,7 @@ class PythonGenerator extends Generator { this.code.line(`url="${assm.homepage}",`); this.code.line('package_dir={"": "src"},'); this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`) - this.code.line(`package_data={"${this.toPythonModuleName(assm.name)}._jsii": ["*.jsii.tgz"]},`); + this.code.line(`package_data={"${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); this.code.line('python_requires=">=3.6",'); this.code.unindent(")"); this.code.closeFile("setup.py"); From 653d774ac8c6067a76bbb8db1e1809a1a3303f8f Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 23:02:28 -0400 Subject: [PATCH 026/117] Handle recurisve generic collection types --- packages/jsii-pacmak/lib/targets/python.ts | 42 +++++++++++++++------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 6d32f3f133..f58f5a2616 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -84,19 +84,7 @@ class Module { } public maybeImportType(type: string) { - let types: string[] = []; - - // Before we do anything else, we need to split apart any collections, these - // always have the syntax of something[something, maybesomething], so we'll - // check for [] first. - if (type.match(/[^\[]*\[.+\]/)) { - const [, genericType, innerTypes] = type.match(/([^\[]*)\[(.+)\]/) as any[]; - - types.push(genericType.trim()); - types.push(...innerTypes.split(",").map((s: string) => s.trim())); - } else { - types.push(type.trim()); - } + const types = this.extractTypes(type); // Loop over all of the types we've discovered, and check them for being // importable @@ -125,6 +113,34 @@ class Module { } } + private extractTypes(type: string): string[] { + let types: string[] = []; + + // Before we do anything else, we need to split apart any collections, these + // always have the syntax of something[something, maybesomething], so we'll + // check for [] first. + if (type.match(/[^\[]*\[.+\]/)) { + let [, genericType, parsedTypes] = type.match(/([^\[]*)\[(.+)\]/) as any[]; + parsedTypes = parsedTypes.split(",").map((s: string) => s.trim()); + + const innerTypes: string[] = []; + for (let innerType of parsedTypes) { + if (innerType.match(/\[/)) { + innerTypes.push(...this.extractTypes(innerType)); + } else { + innerTypes.push(innerType); + } + } + + types.push(genericType.trim()); + types.push(...innerTypes); + } else { + types.push(type.trim()); + } + + return types; + } + // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot // Operate on more than one file at a time, so we have to buffer our calls to // CodeMaker, otherwise we can end up in inconsistent state when we get things like: From 52f62d888adfe264a827a9a5737cb0c8af3789dc Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 28 Sep 2018 23:02:53 -0400 Subject: [PATCH 027/117] Handle classes and interfaces without bodies --- packages/jsii-pacmak/lib/targets/python.ts | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index f58f5a2616..7a2e1d0483 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -348,8 +348,16 @@ class PythonGenerator extends Generator { this.currentModule().openBlock(`class ${clsName}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); } - protected onEndClass(_cls: spec.ClassType) { - this.currentModule().closeBlock(); + protected onEndClass(cls: spec.ClassType) { + const currentModule = this.currentModule(); + + // If our class does not have any members, then we need to emit a pass statement + // to give it *some* kind of a body. + if (cls.properties == undefined && cls.methods == undefined) { + currentModule.line("pass"); + } + + currentModule.closeBlock(); } protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { @@ -404,8 +412,16 @@ class PythonGenerator extends Generator { currentModule.openBlock(`class ${interfaceName}(${interfaceBases.join(",")})`); } - protected onEndInterface(_ifc: spec.InterfaceType) { - this.currentModule().closeBlock(); + protected onEndInterface(ifc: spec.InterfaceType) { + const currentModule = this.currentModule(); + + // If our interface does not have any members, then we need to emit a pass + // statement to give it *some* kind of a body. + if (ifc.properties == undefined && ifc.methods == undefined) { + currentModule.line("pass"); + } + + currentModule.closeBlock(); } protected onInterfaceMethod(_ifc: spec.InterfaceType, method: spec.Method) { From 0408cb3ea32779b893832839b798e6499a925667 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 29 Sep 2018 00:20:39 -0400 Subject: [PATCH 028/117] Use a better mechanism of extracting a list of types --- packages/jsii-pacmak/lib/targets/python.ts | 34 ++++------------------ 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 7a2e1d0483..17fb2205b8 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -84,7 +84,11 @@ class Module { } public maybeImportType(type: string) { - const types = this.extractTypes(type); + // If we split our types by any of the "special" characters that can't appear in + // identifiers (like "[],") then we will get a list of all of the identifiers, + // no matter how nested they are. The downside is we might get trailing/leading + // spaces or empty items so we'll need to trim and filter this list. + const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); // Loop over all of the types we've discovered, and check them for being // importable @@ -113,34 +117,6 @@ class Module { } } - private extractTypes(type: string): string[] { - let types: string[] = []; - - // Before we do anything else, we need to split apart any collections, these - // always have the syntax of something[something, maybesomething], so we'll - // check for [] first. - if (type.match(/[^\[]*\[.+\]/)) { - let [, genericType, parsedTypes] = type.match(/([^\[]*)\[(.+)\]/) as any[]; - parsedTypes = parsedTypes.split(",").map((s: string) => s.trim()); - - const innerTypes: string[] = []; - for (let innerType of parsedTypes) { - if (innerType.match(/\[/)) { - innerTypes.push(...this.extractTypes(innerType)); - } else { - innerTypes.push(innerType); - } - } - - types.push(genericType.trim()); - types.push(...innerTypes); - } else { - types.push(type.trim()); - } - - return types; - } - // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot // Operate on more than one file at a time, so we have to buffer our calls to // CodeMaker, otherwise we can end up in inconsistent state when we get things like: From b8b40c045918460e1a53fbdc533c9358936ef8ac Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 29 Sep 2018 00:33:53 -0400 Subject: [PATCH 029/117] Add a bit of extra documentation --- packages/jsii-pacmak/lib/targets/python.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 17fb2205b8..828df3e22d 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -83,6 +83,8 @@ class Module { } } + // Giving a type hint, extract all of the relevant types that are involved, and if + // they are defined in another module, mark that module for import. public maybeImportType(type: string) { // If we split our types by any of the "special" characters that can't appear in // identifiers (like "[],") then we will get a list of all of the identifiers, From 848ed7ac9de08889fa162fd465d6e7a5eae8a718 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 29 Sep 2018 03:20:25 -0400 Subject: [PATCH 030/117] Bump version --- .../jsii-python-runtime/src/jsii/_kernel/providers/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 11d7fe62c3..55b5808570 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -213,7 +213,7 @@ def handshake(self): # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.7.4" + resp.hello == "jsii-runtime@0.7.6" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( From 855c2a8f40002a67fe9a396303c9930422595397 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 29 Sep 2018 18:16:24 -0400 Subject: [PATCH 031/117] Fix formatting to handle nested types --- packages/jsii-pacmak/lib/targets/python.ts | 52 ++++++++++++++-------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 828df3e22d..da86068cc1 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -379,7 +379,7 @@ class PythonGenerator extends Generator { let interfaceBases: string[] = []; for (let interfaceBase of (ifc.interfaces || [])) { let interfaceBaseType = this.toPythonType(interfaceBase); - interfaceBases.push(this.formatPythonType(interfaceBaseType, true)); + interfaceBases.push(this.formatPythonType(interfaceBaseType, true, currentModule.name)); currentModule.maybeImportType(interfaceBaseType); } interfaceBases.push("_Protocol"); @@ -435,10 +435,10 @@ class PythonGenerator extends Generator { module.maybeImportType(paramType); - pythonParams.push(`${paramName}: ${this.formatPythonType(paramType)}`); + pythonParams.push(`${paramName}: ${this.formatPythonType(paramType, false, module.name)}`); } - module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${this.formatPythonType(returnType)}`); + module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${this.formatPythonType(returnType, false, module.name)}`); module.line("..."); module.closeBlock(); } @@ -506,26 +506,40 @@ class PythonGenerator extends Generator { }).join("."); } - private formatPythonType(type: string, fowardReference: boolean = false) { - // Built in types do not need formatted in any particular way. - if(PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { - return type; - } + private formatPythonType(type: string, forwardReference: boolean = false, moduleName: string) { + // If we split our types by any of the "special" characters that can't appear in + // identifiers (like "[],") then we will get a list of all of the identifiers, + // no matter how nested they are. The downside is we might get trailing/leading + // spaces or empty items so we'll need to trim and filter this list. + const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); - const [, typeModule, typeName] = type.match(/(.*)\.(.*)/) as any[]; + for (let innerType of types) { + // Built in types do not need formatted in any particular way. + if(PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { + continue; + } - // Types whose module is different than our current module, can also just be - // formatted as they are. - if (this.currentModule().name != typeModule) { - return type; + // If we do not have a current moduleName, or the type is not within that + // module, then we don't format it any particular way. + if (!innerType.startsWith(moduleName + ".")) { + continue; + } else { + const re = new RegExp('[^\[,\s]"?' + innerType + '"?[$\],\s]'); + + // If this is our current module, then we need to correctly handle our + // forward references, by placing the type inside of quotes, unless + // we're returning real forward references. + if (!forwardReference) { + type = type.replace(re, `"${innerType}"`); + } + + // Now that we've handled (or not) our forward references, then we want + // to replace the module with just the type name. + type = type.replace(re, innerType.substring(moduleName.length + 1, innerType.length)); + } } - // Otherwise, this is a type that exists in this module, and we can jsut emit - // the name. - // TODO: We currently emit this as a string, because that's how forward - // references used to work prior to 3.7. Ideally we will move to using 3.7 - // and can just use native forward references. - return fowardReference ? typeName : `"${typeName}"`; + return type; } private currentModule(): Module { From d4b1fe82db0ad7808a7e095229a6d19c6b37e44e Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 29 Sep 2018 22:51:45 -0400 Subject: [PATCH 032/117] Refactor various toPythonXXX functions into stand alone functions --- packages/jsii-pacmak/lib/targets/python.ts | 286 +++++++++++---------- 1 file changed, 147 insertions(+), 139 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index da86068cc1..c65c166103 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -5,7 +5,7 @@ import util = require('util'); import * as spec from 'jsii-spec'; import { Generator, GeneratorOptions } from '../generator'; import { Target, TargetOptions } from '../target'; -import { CodeMaker } from 'codemaker'; +import { CodeMaker, toSnakeCase } from 'codemaker'; import { shell } from '../util'; export default class Python extends Target { @@ -46,6 +46,135 @@ const PYTHON_KEYWORDS = [ ] +function toPythonModuleName(name: string): string { + if (name.match(/^@[^/]+\/[^/]+$/)) { + name = name.replace(/^@/g, ""); + name = name.replace(/\//g, "."); + } + + name = toSnakeCase(name.replace(/-/g, "_")); + + return name; +} + + +function toPythonModuleFilename(name: string): string { + if (name.match(/^@[^/]+\/[^/]+$/)) { + name = name.replace(/^@/g, ""); + name = name.replace(/\//g, "."); + } + + name = name.replace(/\./g, "/"); + + return name; +} + + +function toPythonPackageName(name: string): string { + return toPythonModuleName(name).replace(/_/g, "-"); +} + + +function toPythonIdentifier(name: string): string { + if (PYTHON_KEYWORDS.indexOf(name) > -1) { + return name + "_"; + } + + return name; +} + + +function toPythonType(typeref: spec.TypeReference): string { + if (spec.isPrimitiveTypeReference(typeref)) { + return toPythonPrimitive(typeref.primitive); + } else if (spec.isCollectionTypeReference(typeref)) { + return toPythonCollection(typeref); + } else if (spec.isNamedTypeReference(typeref)) { + return toPythonFQN(typeref.fqn); + } else if (typeref.union) { + const types = new Array(); + for (const subtype of typeref.union.types) { + types.push(toPythonType(subtype)); + } + return `typing.Union[${types.join(", ")}]`; + } else { + throw new Error("Invalid type reference: " + JSON.stringify(typeref)); + } +} + +function toPythonCollection(ref: spec.CollectionTypeReference) { + const elementPythonType = toPythonType(ref.collection.elementtype); + switch (ref.collection.kind) { + case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; + case spec.CollectionKind.Map: return `typing.Mapping[str,${elementPythonType}]`; + default: + throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); + } +} + + +function toPythonPrimitive(primitive: spec.PrimitiveType): string { + switch (primitive) { + case spec.PrimitiveType.Boolean: return "bool"; + case spec.PrimitiveType.Date: return "dateetime.datetime"; + case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; + case spec.PrimitiveType.Number: return "numbers.Number"; + case spec.PrimitiveType.String: return "str"; + case spec.PrimitiveType.Any: return "typing.Any"; + default: + throw new Error("Unknown primitive type: " + primitive); + } +} + + +function toPythonFQN(name: string): string { + return name.split(".").map((cur, idx, arr) => { + if (idx == arr.length - 1) { + return toPythonIdentifier(cur); + } else { + return toPythonModuleName(cur); + } + }).join("."); +} + + +function formatPythonType(type: string, forwardReference: boolean = false, moduleName: string) { + // If we split our types by any of the "special" characters that can't appear in + // identifiers (like "[],") then we will get a list of all of the identifiers, + // no matter how nested they are. The downside is we might get trailing/leading + // spaces or empty items so we'll need to trim and filter this list. + const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); + + for (let innerType of types) { + // Built in types do not need formatted in any particular way. + if(PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { + continue; + } + + // If we do not have a current moduleName, or the type is not within that + // module, then we don't format it any particular way. + if (!innerType.startsWith(moduleName + ".")) { + continue; + } else { + const re = new RegExp('[^\[,\s]"?' + innerType + '"?[$\],\s]'); + + // If this is our current module, then we need to correctly handle our + // forward references, by placing the type inside of quotes, unless + // we're returning real forward references. + if (!forwardReference) { + type = type.replace(re, `"${innerType}"`); + } + + // Now that we've handled (or not) our forward references, then we want + // to replace the module with just the type name. + type = type.replace(re, innerType.substring(moduleName.length + 1, innerType.length)); + } + } + + return type; +} + + class Module { readonly name: string; @@ -235,7 +364,7 @@ class PythonGenerator extends Generator { } protected getAssemblyOutputDir(mod: spec.Assembly) { - return path.join("src", this.toPythonModuleFilename(this.toPythonModuleName(mod.name)), "_jsii"); + return path.join("src", toPythonModuleFilename(toPythonModuleName(mod.name)), "_jsii"); } protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { @@ -248,8 +377,8 @@ class PythonGenerator extends Generator { } protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { - const packageName = this.toPythonPackageName(assm.name); - const topLevelModuleName = this.toPythonModuleName(packageName); + const packageName = toPythonPackageName(assm.name); + const topLevelModuleName = toPythonModuleName(packageName); const moduleNames = this.modules.map(m => m.name); moduleNames.push(`${topLevelModuleName}._jsii`); @@ -292,7 +421,7 @@ class PythonGenerator extends Generator { } protected onBeginNamespace(ns: string) { - const moduleName = this.toPythonModuleName(ns); + const moduleName = toPythonModuleName(ns); const loadAssembly = this.assembly.name == ns ? true : false; let moduleArgs: any[] = []; @@ -309,7 +438,7 @@ class PythonGenerator extends Generator { protected onEndNamespace(_ns: string) { let module = this.moduleStack.pop() as Module; - let moduleFilename = path.join("src", this.toPythonModuleFilename(module.name), "__init__.py"); + let moduleFilename = path.join("src", toPythonModuleFilename(module.name), "__init__.py"); this.code.openFile(moduleFilename); module.write(this.code); @@ -317,7 +446,7 @@ class PythonGenerator extends Generator { } protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { - const clsName = this.toPythonIdentifier(cls.name); + const clsName = toPythonIdentifier(cls.name); // TODO: Figure out what to do with abstract here. abstract; @@ -340,7 +469,7 @@ class PythonGenerator extends Generator { protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { // TODO: Handle the case where the Python name and the JSII name differ. - const methodName = this.toPythonIdentifier(method.name!); + const methodName = toPythonIdentifier(method.name!); this.currentModule().line("@_jsii_classmethod"); this.emitPythonMethod(methodName, "cls", method.parameters, method.returns); @@ -348,7 +477,7 @@ class PythonGenerator extends Generator { protected onMethod(_cls: spec.ClassType, method: spec.Method) { // TODO: Handle the case where the Python name and the JSII name differ. - const methodName = this.toPythonIdentifier(method.name!); + const methodName = toPythonIdentifier(method.name!); this.currentModule().line("@_jsii_method"); this.emitPythonMethod(methodName, "self", method.parameters, method.returns); @@ -356,7 +485,7 @@ class PythonGenerator extends Generator { protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { // TODO: Handle the case where the Python name and the JSII name differ. - const propertyName = this.toPythonIdentifier(prop.name!); + const propertyName = toPythonIdentifier(prop.name!); // TODO: Properties have a bunch of states, they can have getters and setters // we need to better handle all of these cases. @@ -366,7 +495,7 @@ class PythonGenerator extends Generator { protected onProperty(_cls: spec.ClassType, prop: spec.Property) { // TODO: Handle the case where the Python name and the JSII name differ. - const propertyName = this.toPythonIdentifier(prop.name!); + const propertyName = toPythonIdentifier(prop.name!); this.currentModule().line("@_jsii_property"); this.emitPythonMethod(propertyName, "self", [], prop.type); @@ -403,13 +532,13 @@ class PythonGenerator extends Generator { } protected onInterfaceMethod(_ifc: spec.InterfaceType, method: spec.Method) { - const methodName = this.toPythonIdentifier(method.name!); + const methodName = toPythonIdentifier(method.name!); this.emitPythonMethod(methodName, "self", method.parameters, method.returns); } protected onInterfaceProperty(_ifc: spec.InterfaceType, prop: spec.Property) { - const propertyName = this.toPythonIdentifier(prop.name!); + const propertyName = toPythonIdentifier(prop.name!); this.currentModule().line("@property"); this.emitPythonMethod(propertyName, "self", [], prop.type); @@ -419,7 +548,7 @@ class PythonGenerator extends Generator { let module = this.currentModule(); // TODO: Handle imports (if needed) for type. - const returnType = returns ? this.toPythonType(returns) : "None"; + const returnType = returns ? toPythonType(returns) : "None"; module.maybeImportType(returnType); @@ -430,144 +559,23 @@ class PythonGenerator extends Generator { let pythonParams: string[] = implicitParam ? [implicitParam] : []; for (let param of params) { - let paramName = this.toPythonIdentifier(param.name); - let paramType = this.toPythonType(param.type); + let paramName = toPythonIdentifier(param.name); + let paramType = toPythonType(param.type); module.maybeImportType(paramType); - pythonParams.push(`${paramName}: ${this.formatPythonType(paramType, false, module.name)}`); + pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, module.name)}`); } - module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${this.formatPythonType(returnType, false, module.name)}`); + module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, module.name)}`); module.line("..."); module.closeBlock(); } - private toPythonPackageName(name: string): string { - return this.toPythonModuleName(name).replace(/_/g, "-"); - } - - private toPythonIdentifier(name: string): string { - if (PYTHON_KEYWORDS.indexOf(name) > -1) { - return name + "_"; - } - - return name; - } - - private toPythonType(typeref: spec.TypeReference): string { - if (spec.isPrimitiveTypeReference(typeref)) { - return this.toPythonPrimitive(typeref.primitive); - } else if (spec.isCollectionTypeReference(typeref)) { - return this.toPythonCollection(typeref); - } else if (spec.isNamedTypeReference(typeref)) { - return this.toPythonFQN(typeref.fqn); - } else if (typeref.union) { - const types = new Array(); - for (const subtype of typeref.union.types) { - types.push(this.toPythonType(subtype)); - } - return `typing.Union[${types.join(", ")}]`; - } else { - throw new Error("Invalid type reference: " + JSON.stringify(typeref)); - } - } - - private toPythonCollection(ref: spec.CollectionTypeReference) { - const elementPythonType = this.toPythonType(ref.collection.elementtype); - switch (ref.collection.kind) { - case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; - case spec.CollectionKind.Map: return `typing.Mapping[str,${elementPythonType}]`; - default: - throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); - } - } - - private toPythonPrimitive(primitive: spec.PrimitiveType): string { - switch (primitive) { - case spec.PrimitiveType.Boolean: return "bool"; - case spec.PrimitiveType.Date: return "dateetime.datetime"; - case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; - case spec.PrimitiveType.Number: return "numbers.Number"; - case spec.PrimitiveType.String: return "str"; - case spec.PrimitiveType.Any: return "typing.Any"; - default: - throw new Error("Unknown primitive type: " + primitive); - } - } - - private toPythonFQN(name: string): string { - return name.split(".").map((cur, idx, arr) => { - if (idx == arr.length - 1) { - return this.toPythonIdentifier(cur); - } else { - return this.toPythonModuleName(cur); - } - }).join("."); - } - - private formatPythonType(type: string, forwardReference: boolean = false, moduleName: string) { - // If we split our types by any of the "special" characters that can't appear in - // identifiers (like "[],") then we will get a list of all of the identifiers, - // no matter how nested they are. The downside is we might get trailing/leading - // spaces or empty items so we'll need to trim and filter this list. - const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); - - for (let innerType of types) { - // Built in types do not need formatted in any particular way. - if(PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { - continue; - } - - // If we do not have a current moduleName, or the type is not within that - // module, then we don't format it any particular way. - if (!innerType.startsWith(moduleName + ".")) { - continue; - } else { - const re = new RegExp('[^\[,\s]"?' + innerType + '"?[$\],\s]'); - - // If this is our current module, then we need to correctly handle our - // forward references, by placing the type inside of quotes, unless - // we're returning real forward references. - if (!forwardReference) { - type = type.replace(re, `"${innerType}"`); - } - - // Now that we've handled (or not) our forward references, then we want - // to replace the module with just the type name. - type = type.replace(re, innerType.substring(moduleName.length + 1, innerType.length)); - } - } - - return type; - } - private currentModule(): Module { return this.moduleStack.slice(-1)[0]; } - private toPythonModuleName(name: string): string { - if (name.match(/^@[^/]+\/[^/]+$/)) { - name = name.replace(/^@/g, ""); - name = name.replace(/\//g, "."); - } - - name = this.code.toSnakeCase(name.replace(/-/g, "_")); - - return name; - } - - private toPythonModuleFilename(name: string): string { - if (name.match(/^@[^/]+\/[^/]+$/)) { - name = name.replace(/^@/g, ""); - name = name.replace(/\//g, "."); - } - - name = name.replace(/\./g, "/"); - - return name; - } - // Not Currently Used protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { From 322f04f6dd2883db0610ee0e00ca488799f85e0a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 02:00:40 -0400 Subject: [PATCH 033/117] Drastic refactoring to delay emiting lines until the very end This is a WIP refactoring, it all works but it needs a lot of clean up. --- packages/jsii-pacmak/lib/targets/python.ts | 675 +++++++++++++++------ 1 file changed, 487 insertions(+), 188 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index c65c166103..700fa7cc47 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -156,18 +156,20 @@ function formatPythonType(type: string, forwardReference: boolean = false, modul if (!innerType.startsWith(moduleName + ".")) { continue; } else { - const re = new RegExp('[^\[,\s]"?' + innerType + '"?[$\],\s]'); + const typeName = innerType.substring(moduleName.length + 1, innerType.length); + const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); // If this is our current module, then we need to correctly handle our // forward references, by placing the type inside of quotes, unless // we're returning real forward references. if (!forwardReference) { - type = type.replace(re, `"${innerType}"`); + type = type.replace(re, `$1"${innerType}"$2`); } // Now that we've handled (or not) our forward references, then we want // to replace the module with just the type name. - type = type.replace(re, innerType.substring(moduleName.length + 1, innerType.length)); + // type = type.replace(re, "$1" + innerType.substring(moduleName.length + 1, innerType.length) + "$2"); + type = type.replace(re, `$1${typeName}$2`); } } @@ -175,125 +177,387 @@ function formatPythonType(type: string, forwardReference: boolean = false, modul } -class Module { +interface Writable { + write(code: CodeMaker): void; +} + + +interface WithMembers { + addMember(member: PythonItem): PythonItem; +} + + +interface PythonItem { readonly name: string; - readonly assembly?: spec.Assembly; - readonly assemblyFilename?: string; + requiredTypes(): string[]; +} - private buffer: object[]; - private exportedNames: string[]; - private importedModules: string[]; - constructor(ns: string, assembly?: [spec.Assembly, string]) { - this.name = ns; +type ModuleMember = PythonItem & WithMembers & Writable; - if (assembly != undefined) { - this.assembly = assembly[0]; - this.assemblyFilename = assembly[1]; + +class InterfaceMethod implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + + private readonly parameters: spec.Parameter[]; + private readonly returns?: spec.TypeReference; + + constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.parameters = parameters; + this.returns = returns; + } + + public requiredTypes(): string[] { + const types: string[] = [this.getReturnType(this.returns)]; + + for (let param of this.parameters) { + types.push(toPythonType(param.type)); } - this.buffer = []; - this.exportedNames = []; - this.importedModules = []; + return types; } - // Adds a name to the list of names that this module will export, this will control - // things like what is listed inside of __all__. - public exportName(name: string) { - this.exportedNames.push(name); + public write(code: CodeMaker) { + const returnType = this.getReturnType(this.returns); + + // We need to turn a list of JSII parameters, into Python style arguments with + // gradual typing, so we'll have to iterate over the list of parameters, and + // build the list, converting as we go. + // TODO: Handle imports (if needed) for all of these types. + let pythonParams: string[] = ["self"] + for (let param of this.parameters) { + const paramName = toPythonIdentifier(param.name); + const paramType = toPythonType(param.type); + + pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); + } + + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); + } + + private getReturnType(type?: spec.TypeReference): string { + return type ? toPythonType(type) : "None"; + } +} + +class InterfaceProperty implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + private readonly type: spec.TypeReference; + + constructor(moduleName: string, name: string, type: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.type = type; + } + + public requiredTypes(): string[] { + return [toPythonType(this.type)]; + } + + public write(code: CodeMaker) { + const returnType = toPythonType(this.type); + + code.line("@property"); + code.openBlock(`def ${this.name}(self) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); + } +} + + +class Interface implements ModuleMember { + + public readonly moduleName: string; + public readonly name: string; + + private bases: string[]; + private members: (PythonItem & Writable)[]; + + constructor(moduleName: string, name: string, bases: string[]) { + this.moduleName = moduleName; + this.name = name; + + this.bases = bases; + this.members = []; + } + + public addMember(member: PythonItem & Writable): PythonItem { + this.members.push(member); + return member; } - // Adds a name to the list of modules that should be imported at the top of this - // file. - public importModule(name: string) { - if (!this.importedModules.includes(name)) { - this.importedModules.push(name); + public requiredTypes(): string[] { + const types = this.bases.slice(); + + for (let member of this.members) { + types.push(...member.requiredTypes()); } + + return types; } - // Giving a type hint, extract all of the relevant types that are involved, and if - // they are defined in another module, mark that module for import. - public maybeImportType(type: string) { - // If we split our types by any of the "special" characters that can't appear in - // identifiers (like "[],") then we will get a list of all of the identifiers, - // no matter how nested they are. The downside is we might get trailing/leading - // spaces or empty items so we'll need to trim and filter this list. - const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); + public write(code: CodeMaker) { + // TODO: Data Types? + + const interfaceBases = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); + interfaceBases.push("_Protocol"); - // Loop over all of the types we've discovered, and check them for being - // importable - for (let type of types) { - // For built in types, we don't need to do anything, and can just move on. - if (PYTHON_BUILTIN_TYPES.indexOf(type) > -1) { continue; } - - let [, typeModule] = type.match(/(.*)\.(.*)/) as any[]; - - // Given a name like foo.bar.Frob, we want to import the module that Frob exists - // in. Given that all classes exported by JSII have to be pascal cased, and all - // of our imports are snake cases, this should be safe. We're going to double - // check this though, to ensure that our importable here is safe. - if (typeModule != typeModule.toLowerCase()) { - // If we ever get to this point, we'll need to implment aliasing for our - // imports. - throw new Error(`Type module is not lower case: '${typeModule}'`); + code.openBlock(`class ${this.name}(${interfaceBases.join(",")})`); + if (this.members.length > 0) { + for (let member of this.members) { + member.write(code); } + } else { + code.line("pass"); + } + code.closeBlock(); + } +} - // We only want to actually import the type for this module, if it isn't the - // module that we're currently in, otherwise we'll jus rely on the module scope - // to make the name available to us. - if (typeModule != this.name) { - this.importModule(typeModule); - } + +class StaticMethod implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + + private readonly parameters: spec.Parameter[]; + private readonly returns?: spec.TypeReference; + + constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.parameters = parameters; + this.returns = returns; + } + + public requiredTypes(): string[] { + const types: string[] = [this.getReturnType(this.returns)]; + + for (let param of this.parameters) { + types.push(toPythonType(param.type)); } + + return types; + } + + public write(code: CodeMaker) { + const returnType = this.getReturnType(this.returns); + + // We need to turn a list of JSII parameters, into Python style arguments with + // gradual typing, so we'll have to iterate over the list of parameters, and + // build the list, converting as we go. + // TODO: Handle imports (if needed) for all of these types. + let pythonParams: string[] = ["cls"] + for (let param of this.parameters) { + const paramName = toPythonIdentifier(param.name); + const paramType = toPythonType(param.type); + + pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); + } + + code.line("@_jsii_classmethod"); + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); + } + + private getReturnType(type?: spec.TypeReference): string { + return type ? toPythonType(type) : "None"; + } +} + + +class Method implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + + private readonly parameters: spec.Parameter[]; + private readonly returns?: spec.TypeReference; + + constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.parameters = parameters; + this.returns = returns; + } + + public requiredTypes(): string[] { + const types: string[] = [this.getReturnType(this.returns)]; + + for (let param of this.parameters) { + types.push(toPythonType(param.type)); + } + + return types; + } + + public write(code: CodeMaker) { + const returnType = this.getReturnType(this.returns); + + // We need to turn a list of JSII parameters, into Python style arguments with + // gradual typing, so we'll have to iterate over the list of parameters, and + // build the list, converting as we go. + // TODO: Handle imports (if needed) for all of these types. + let pythonParams: string[] = ["self"] + for (let param of this.parameters) { + const paramName = toPythonIdentifier(param.name); + const paramType = toPythonType(param.type); + + pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); + } + + code.line("@_jsii_method"); + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); + } + + private getReturnType(type?: spec.TypeReference): string { + return type ? toPythonType(type) : "None"; + } +} + + +class StaticProperty implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + private readonly type: spec.TypeReference; + + constructor(moduleName: string, name: string, type: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.type = type; + } + + public requiredTypes(): string[] { + return [toPythonType(this.type)]; } - // We're purposely replicating the API of CodeMaker here, because CodeMaker cannot - // Operate on more than one file at a time, so we have to buffer our calls to - // CodeMaker, otherwise we can end up in inconsistent state when we get things like: - // - onBeginNamespace(foo) - // - onBeginNamespace(foo.bar) - // - OnEndNamespace(foo.bar) - // - Inconsitent State, where we're now back in the scope of foo, but due to - // the fact that if we had opened a file in onBeginNamespace(foo), we would - // have had to close it for onBeginNamespace(foo.bar), and re-opening it - // would overwrite the contents. - // - OnEndNamespace(foo) - // To solve this, we buffer all of the things we *would* have written out via - // CodeMaker via this API, and then we will just iterate over it in the - // onEndNamespace event and write it out then. + public write(code: CodeMaker) { + const returnType = toPythonType(this.type); - public line(...args: any[]) { - this.buffer.push({method: "line", args: args}); + code.line("@_jsii_classproperty"); + code.openBlock(`def ${this.name}(cls) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); } +} + - public indent(...args: any[]) { - this.buffer.push({method: "indent", args: args}); +class Property implements PythonItem, Writable { + + public readonly moduleName: string; + public readonly name: string; + private readonly type: spec.TypeReference; + + constructor(moduleName: string, name: string, type: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.type = type; } - public unindent(...args: any[]) { - this.buffer.push({method: "unindent", args: args}); + public requiredTypes(): string[] { + return [toPythonType(this.type)]; } - public open(...args: any[]) { - this.buffer.push({method: "open", args: args}); + public write(code: CodeMaker) { + const returnType = toPythonType(this.type); + + code.line("@_jsii_property"); + code.openBlock(`def ${this.name}(self) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line("..."); + code.closeBlock(); } +} + + +class Class implements ModuleMember { + public readonly moduleName: string; + public readonly name: string; - public close(...args: any[]) { - this.buffer.push({method: "close", args: args}); + private jsii_fqn: string; + private members: (PythonItem & Writable)[]; + + constructor(moduleName: string, name: string, jsii_fqn: string) { + this.moduleName = moduleName; + this.name = name; + + this.jsii_fqn = jsii_fqn; + this.members = []; } - public openBlock(...args: any[]) { - this.buffer.push({method: "openBlock", args: args}); + public addMember(member: PythonItem & Writable): PythonItem { + this.members.push(member); + return member; } - public closeBlock(...args: any[]) { - this.buffer.push({method: "closeBlock", args: args}); + public requiredTypes(): string[] { + const types: string[] = []; + + for (let member of this.members) { + types.push(...member.requiredTypes()); + } + + return types; } public write(code: CodeMaker) { - // Before we do Anything, we need to write out our module headers, this is where - // we handle stuff like imports, any required initialization, etc. + // TODO: Data Types? + // TODO: Bases + + code.openBlock(`class ${this.name}(metaclass=_JSIIMeta, jsii_type="${this.jsii_fqn}")`); + if (this.members.length > 0) { + for (let member of this.members) { + member.write(code); + } + } else { + code.line("pass"); + } + code.closeBlock(); + } +} + + + +class Module { + + readonly name: string; + readonly assembly?: spec.Assembly; + readonly assemblyFilename?: string; + + private members: ModuleMember[]; + + constructor(ns: string, assembly?: [spec.Assembly, string]) { + this.name = ns; + + if (assembly != undefined) { + this.assembly = assembly[0]; + this.assemblyFilename = assembly[1]; + } + + this.members = []; + } + + public addMember(member: ModuleMember): ModuleMember { + this.members.push(member); + + return member; + } + + public write(code: CodeMaker) { + // Before we write anything else, we need to write out our module headers, this + // is where we handle stuff like imports, any required initialization, etc. code.line(this.generateImportFrom("jsii.compat", ["Protocol"])); code.line( this.generateImportFrom( @@ -310,7 +574,8 @@ class Module { ); // Go over all of the modules that we need to import, and import them. - for (let [idx, modName] of this.importedModules.sort().entries()) { + // for (let [idx, modName] of this.importedModules.sort().entries()) { + for (let [idx, modName] of this.getRequiredTypeImports().sort().entries()) { if (idx == 0) { code.line(); } @@ -320,22 +585,83 @@ class Module { // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { - this.exportName("__jsii_assembly__"); code.line(`__jsii_assembly__ = _JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); } // Now that we've gotten all of the module header stuff done, we need to go // through and actually write out the meat of our module. - for (let buffered of this.buffer) { - let methodName = (buffered as any)["method"] as string; - let args = (buffered as any)["args"] as any[]; + // TODO: We need to handle sorting our members prior to writing them out, so + // that we write out anything that a particular member depends on, prior + // to actually writing out that member. + for (let member of this.members) { + member.write(code); + } + + // // Whatever names we've exported, we'll write out our __all__ that lists them. + code.line(`__all__ = [${this.getExportedNames().map(s => `"${s}"`).join(", ")}]`); + } + + private getRequiredTypeImports(): string[] { + const types: string[] = [] + const imports: string[] = []; + + // Compute a list of all of of the types that + for (let member of this.members) { + types.push(...member.requiredTypes()); + } + + // Go over our types, and generate a list of imports that we need to import for + // our module. + for (let type of types) { + // If we split our types by any of the "special" characters that can't appear in + // identifiers (like "[],") then we will get a list of all of the identifiers, + // no matter how nested they are. The downside is we might get trailing/leading + // spaces or empty items so we'll need to trim and filter this list. + const subTypes = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); + + // Loop over all of the types we've discovered, and check them for being + // importable + for (let subType of subTypes) { + // For built in types, we don't need to do anything, and can just move on. + if (PYTHON_BUILTIN_TYPES.indexOf(subType) > -1) { continue; } + + let [, typeModule] = subType.match(/(.*)\.(.*)/) as any[]; + + // Given a name like foo.bar.Frob, we want to import the module that Frob exists + // in. Given that all classes exported by JSII have to be pascal cased, and all + // of our imports are snake cases, this should be safe. We're going to double + // check this though, to ensure that our importable here is safe. + if (typeModule != typeModule.toLowerCase()) { + // If we ever get to this point, we'll need to implment aliasing for our + // imports. + throw new Error(`Type module is not lower case: '${typeModule}'`); + } + + // We only want to actually import the type for this module, if it isn't the + // module that we're currently in, otherwise we'll jus rely on the module scope + // to make the name available to us. + if (typeModule != this.name && imports.indexOf(typeModule) == -1) { + imports.push(typeModule); + } + } + } + + return imports; + } + + private getExportedNames(): string[] { + // We assume that anything that is a member of this module, will be exported by + // this module. + const exportedNames = this.members.map(m => m.name); - (code as any)[methodName](...args); + // If this module will be outputting the Assembly, then we also want to export + // our assembly variable. + if (this.assembly && this.assemblyFilename) { + exportedNames.push("__jsii_assembly__"); } - // Whatever names we've exported, we'll write out our __all__ that lists them. - const stringifiedExportedNames = this.exportedNames.sort().map(s => `"${s}"`); - code.line(`__all__ = [${stringifiedExportedNames.join(", ")}]`); + return exportedNames.sort(); + } private generateImportFrom(from: string, names: string[]): string { @@ -350,6 +676,7 @@ class Module { class PythonGenerator extends Generator { + private currentMember?: ModuleMember; private modules: Module[]; private moduleStack: Module[]; @@ -359,6 +686,7 @@ class PythonGenerator extends Generator { this.code.openBlockFormatter = s => `${s}:`; this.code.closeBlockFormatter = _s => ""; + this.currentMember = undefined; this.modules = []; this.moduleStack = []; } @@ -446,130 +774,101 @@ class PythonGenerator extends Generator { } protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { - const clsName = toPythonIdentifier(cls.name); + const currentModule = this.currentModule(); // TODO: Figure out what to do with abstract here. abstract; - this.currentModule().exportName(clsName); - this.currentModule().openBlock(`class ${clsName}(metaclass=_JSIIMeta, jsii_type="${cls.fqn}")`); + this.currentMember = currentModule.addMember( + new Class( + currentModule.name, + toPythonIdentifier(cls.name), + cls.fqn + ) + ); } - protected onEndClass(cls: spec.ClassType) { - const currentModule = this.currentModule(); - - // If our class does not have any members, then we need to emit a pass statement - // to give it *some* kind of a body. - if (cls.properties == undefined && cls.methods == undefined) { - currentModule.line("pass"); - } - - currentModule.closeBlock(); + protected onEndClass(_cls: spec.ClassType) { + this.currentMember = undefined; } protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { - // TODO: Handle the case where the Python name and the JSII name differ. - const methodName = toPythonIdentifier(method.name!); - - this.currentModule().line("@_jsii_classmethod"); - this.emitPythonMethod(methodName, "cls", method.parameters, method.returns); + this.currentMember!.addMember( + new StaticMethod( + this.currentModule().name, + toPythonIdentifier(method.name!), + method.parameters || [], + method.returns + ) + ); } protected onMethod(_cls: spec.ClassType, method: spec.Method) { - // TODO: Handle the case where the Python name and the JSII name differ. - const methodName = toPythonIdentifier(method.name!); - - this.currentModule().line("@_jsii_method"); - this.emitPythonMethod(methodName, "self", method.parameters, method.returns); + this.currentMember!.addMember( + new Method( + this.currentModule().name, + toPythonIdentifier(method.name!), + method.parameters || [], + method.returns + ) + ); } protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { - // TODO: Handle the case where the Python name and the JSII name differ. - const propertyName = toPythonIdentifier(prop.name!); - - // TODO: Properties have a bunch of states, they can have getters and setters - // we need to better handle all of these cases. - this.currentModule().line("@_jsii_classproperty"); - this.emitPythonMethod(propertyName, "self", [], prop.type); + this.currentMember!.addMember( + new StaticProperty( + this.currentModule().name, + toPythonIdentifier(prop.name!), + prop.type, + ) + ); } protected onProperty(_cls: spec.ClassType, prop: spec.Property) { - // TODO: Handle the case where the Python name and the JSII name differ. - const propertyName = toPythonIdentifier(prop.name!); - - this.currentModule().line("@_jsii_property"); - this.emitPythonMethod(propertyName, "self", [], prop.type); + this.currentMember!.addMember( + new Property( + this.currentModule().name, + toPythonIdentifier(prop.name!), + prop.type, + ) + ); } protected onBeginInterface(ifc: spec.InterfaceType) { const currentModule = this.currentModule(); - const interfaceName = this.toPythonIdentifier(ifc.name); - let interfaceBases: string[] = []; - for (let interfaceBase of (ifc.interfaces || [])) { - let interfaceBaseType = this.toPythonType(interfaceBase); - interfaceBases.push(this.formatPythonType(interfaceBaseType, true, currentModule.name)); - currentModule.maybeImportType(interfaceBaseType); - } - interfaceBases.push("_Protocol"); - - // TODO: Data Type - - currentModule.exportName(interfaceName); - currentModule.openBlock(`class ${interfaceName}(${interfaceBases.join(",")})`); + this.currentMember = currentModule.addMember( + new Interface( + currentModule.name, + toPythonIdentifier(ifc.name), + (ifc.interfaces || []).map(i => toPythonType(i)) + ) + ); } - protected onEndInterface(ifc: spec.InterfaceType) { - const currentModule = this.currentModule(); - - // If our interface does not have any members, then we need to emit a pass - // statement to give it *some* kind of a body. - if (ifc.properties == undefined && ifc.methods == undefined) { - currentModule.line("pass"); - } - - currentModule.closeBlock(); + protected onEndInterface(_ifc: spec.InterfaceType) { + this.currentMember = undefined; } protected onInterfaceMethod(_ifc: spec.InterfaceType, method: spec.Method) { - const methodName = toPythonIdentifier(method.name!); - - this.emitPythonMethod(methodName, "self", method.parameters, method.returns); + this.currentMember!.addMember( + new InterfaceMethod( + this.currentModule().name, + toPythonIdentifier(method.name!), + method.parameters || [], + method.returns + ) + ); } protected onInterfaceProperty(_ifc: spec.InterfaceType, prop: spec.Property) { - const propertyName = toPythonIdentifier(prop.name!); - - this.currentModule().line("@property"); - this.emitPythonMethod(propertyName, "self", [], prop.type); - } - - private emitPythonMethod(name?: string, implicitParam?: string, params: spec.Parameter[] = [], returns?: spec.TypeReference) { - let module = this.currentModule(); - - // TODO: Handle imports (if needed) for type. - const returnType = returns ? toPythonType(returns) : "None"; - module.maybeImportType(returnType); - - - // We need to turn a list of JSII parameters, into Python style arguments with - // gradual typing, so we'll have to iterate over the list of parameters, and - // build the list, converting as we go. - // TODO: Handle imports (if needed) for all of these types. - - let pythonParams: string[] = implicitParam ? [implicitParam] : []; - for (let param of params) { - let paramName = toPythonIdentifier(param.name); - let paramType = toPythonType(param.type); - - module.maybeImportType(paramType); - - pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, module.name)}`); - } - - module.openBlock(`def ${name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, module.name)}`); - module.line("..."); - module.closeBlock(); + this.currentMember!.addMember( + new InterfaceProperty( + this.currentModule().name, + toPythonIdentifier(prop.name!), + prop.type, + ) + ); } private currentModule(): Module { From 6f636dd85756ea657baf348c6ccf7b4472d290a6 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 02:12:48 -0400 Subject: [PATCH 034/117] Remove code duplication amongst the many Method types --- packages/jsii-pacmak/lib/targets/python.ts | 121 ++++----------------- 1 file changed, 21 insertions(+), 100 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 700fa7cc47..97c817a4c6 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -197,11 +197,14 @@ interface PythonItem { type ModuleMember = PythonItem & WithMembers & Writable; -class InterfaceMethod implements PythonItem, Writable { +class BaseMethod implements PythonItem, Writable { public readonly moduleName: string; public readonly name: string; + protected readonly decorator?: string; + protected readonly implicitParameter: string; + private readonly parameters: spec.Parameter[]; private readonly returns?: spec.TypeReference; @@ -229,7 +232,7 @@ class InterfaceMethod implements PythonItem, Writable { // gradual typing, so we'll have to iterate over the list of parameters, and // build the list, converting as we go. // TODO: Handle imports (if needed) for all of these types. - let pythonParams: string[] = ["self"] + let pythonParams: string[] = [this.implicitParameter]; for (let param of this.parameters) { const paramName = toPythonIdentifier(param.name); const paramType = toPythonType(param.type); @@ -237,6 +240,10 @@ class InterfaceMethod implements PythonItem, Writable { pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); } + if (this.decorator != undefined) { + code.line(`@${this.decorator}`); + } + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); code.line("..."); code.closeBlock(); @@ -247,6 +254,12 @@ class InterfaceMethod implements PythonItem, Writable { } } + +class InterfaceMethod extends BaseMethod { + protected readonly implicitParameter: string = "self"; +} + + class InterfaceProperty implements PythonItem, Writable { public readonly moduleName: string; @@ -324,107 +337,15 @@ class Interface implements ModuleMember { } -class StaticMethod implements PythonItem, Writable { - - public readonly moduleName: string; - public readonly name: string; - - private readonly parameters: spec.Parameter[]; - private readonly returns?: spec.TypeReference; - - constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { - this.moduleName = moduleName; - this.name = name; - this.parameters = parameters; - this.returns = returns; - } - - public requiredTypes(): string[] { - const types: string[] = [this.getReturnType(this.returns)]; - - for (let param of this.parameters) { - types.push(toPythonType(param.type)); - } - - return types; - } - - public write(code: CodeMaker) { - const returnType = this.getReturnType(this.returns); - - // We need to turn a list of JSII parameters, into Python style arguments with - // gradual typing, so we'll have to iterate over the list of parameters, and - // build the list, converting as we go. - // TODO: Handle imports (if needed) for all of these types. - let pythonParams: string[] = ["cls"] - for (let param of this.parameters) { - const paramName = toPythonIdentifier(param.name); - const paramType = toPythonType(param.type); - - pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); - } - - code.line("@_jsii_classmethod"); - code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); - code.closeBlock(); - } - - private getReturnType(type?: spec.TypeReference): string { - return type ? toPythonType(type) : "None"; - } +class StaticMethod extends BaseMethod { + protected readonly decorator?: string = "_jsii_classmethod"; + protected readonly implicitParameter: string = "cls"; } -class Method implements PythonItem, Writable { - - public readonly moduleName: string; - public readonly name: string; - - private readonly parameters: spec.Parameter[]; - private readonly returns?: spec.TypeReference; - - constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { - this.moduleName = moduleName; - this.name = name; - this.parameters = parameters; - this.returns = returns; - } - - public requiredTypes(): string[] { - const types: string[] = [this.getReturnType(this.returns)]; - - for (let param of this.parameters) { - types.push(toPythonType(param.type)); - } - - return types; - } - - public write(code: CodeMaker) { - const returnType = this.getReturnType(this.returns); - - // We need to turn a list of JSII parameters, into Python style arguments with - // gradual typing, so we'll have to iterate over the list of parameters, and - // build the list, converting as we go. - // TODO: Handle imports (if needed) for all of these types. - let pythonParams: string[] = ["self"] - for (let param of this.parameters) { - const paramName = toPythonIdentifier(param.name); - const paramType = toPythonType(param.type); - - pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); - } - - code.line("@_jsii_method"); - code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); - code.closeBlock(); - } - - private getReturnType(type?: spec.TypeReference): string { - return type ? toPythonType(type) : "None"; - } +class Method extends BaseMethod { + protected readonly decorator?: string = "_jsii_method"; + protected readonly implicitParameter: string = "self"; } From 78d986dd61ac980964883797972131992e7cb174 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 02:22:57 -0400 Subject: [PATCH 035/117] Remove duplication from property types --- packages/jsii-pacmak/lib/targets/python.ts | 80 +++++++--------------- 1 file changed, 24 insertions(+), 56 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 97c817a4c6..677b24a3d4 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -255,15 +255,14 @@ class BaseMethod implements PythonItem, Writable { } -class InterfaceMethod extends BaseMethod { - protected readonly implicitParameter: string = "self"; -} - - -class InterfaceProperty implements PythonItem, Writable { +class BaseProperty implements PythonItem, Writable { public readonly moduleName: string; public readonly name: string; + + protected readonly decorator: string; + protected readonly implicitParameter: string; + private readonly type: spec.TypeReference; constructor(moduleName: string, name: string, type: spec.TypeReference) { @@ -279,14 +278,25 @@ class InterfaceProperty implements PythonItem, Writable { public write(code: CodeMaker) { const returnType = toPythonType(this.type); - code.line("@property"); - code.openBlock(`def ${this.name}(self) -> ${formatPythonType(returnType, false, this.moduleName)}`); + code.line(`@${this.decorator}`); + code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${formatPythonType(returnType, false, this.moduleName)}`); code.line("..."); code.closeBlock(); } } +class InterfaceMethod extends BaseMethod { + protected readonly implicitParameter: string = "self"; +} + + +class InterfaceProperty extends BaseProperty { + protected readonly decorator: string = "property"; + protected readonly implicitParameter: string = "self"; +} + + class Interface implements ModuleMember { public readonly moduleName: string; @@ -349,57 +359,15 @@ class Method extends BaseMethod { } -class StaticProperty implements PythonItem, Writable { - - public readonly moduleName: string; - public readonly name: string; - private readonly type: spec.TypeReference; - - constructor(moduleName: string, name: string, type: spec.TypeReference) { - this.moduleName = moduleName; - this.name = name; - this.type = type; - } - - public requiredTypes(): string[] { - return [toPythonType(this.type)]; - } - - public write(code: CodeMaker) { - const returnType = toPythonType(this.type); - - code.line("@_jsii_classproperty"); - code.openBlock(`def ${this.name}(cls) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); - code.closeBlock(); - } +class StaticProperty extends BaseProperty { + protected readonly decorator: string = "_jsii_classproperty"; + protected readonly implicitParameter: string = "cls"; } -class Property implements PythonItem, Writable { - - public readonly moduleName: string; - public readonly name: string; - private readonly type: spec.TypeReference; - - constructor(moduleName: string, name: string, type: spec.TypeReference) { - this.moduleName = moduleName; - this.name = name; - this.type = type; - } - - public requiredTypes(): string[] { - return [toPythonType(this.type)]; - } - - public write(code: CodeMaker) { - const returnType = toPythonType(this.type); - - code.line("@_jsii_property"); - code.openBlock(`def ${this.name}(self) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); - code.closeBlock(); - } +class Property extends BaseProperty { + protected readonly decorator: string = "_jsii_property"; + protected readonly implicitParameter: string = "self"; } From ea7736309f02e0c36dc0941b4019a12a5f81ae8c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 02:53:13 -0400 Subject: [PATCH 036/117] Ensure we generate inherited from classes before we inherit from them --- packages/jsii-pacmak/lib/targets/python.ts | 69 ++++++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 677b24a3d4..f8a01a7f08 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -176,6 +176,54 @@ function formatPythonType(type: string, forwardReference: boolean = false, modul return type; } +function sortMembers(sortable: (PythonItem & WithDependencies)[]): (PythonItem & WithDependencies)[] { + // We're going to take a copy of our sortable item, because it'll make it easier if + // this method doesn't have side effects. + sortable = sortable.slice(); + + // Actually sort our now copied array. + sortable.sort((first, second): number => { + // There are 4 possible states that the first and second members could be in: + // 1. Neither member depends on the other. + // 2. The left member depends on the right member. + // 3. The right member depends on the left member. + // 4. The two members depends on each other. + // + // In the case of (1), we can't determine ordering by using the dependencies + // so we'll move along and fall back to another ordering mechanism. + // + // In the case of (2), then we want the right member to come first, so that + // we render it prior to the left member. The opposite is true for (3). + // + // In the case of (4), we've got a cyclic dependency, and we have to error + // out because there's no way for us to represent that. + if (first.depends_on.indexOf(second.name) > -1 && second.depends_on.indexOf(first.name) > -1) { + throw new Error(`${first.name} and ${second.name} have a cyclic dependency and cannot be rendered.`); + } else if (first.depends_on.indexOf(second.name)) { + return 1; + } else if (second.depends_on.indexOf(first.name)) { + return -1; + } + + // If we've gotten here, then the two members given to us do not depend on + // each other. Perhaps in the future we could be smarter and try to do a + // non mandatory dependency so Type Hints might not need forward references + // in *every* case... however for now we'll just do the simpliest thing, and + // sort the two items alphabetically. + if (first.name < second.name) { + return -1; + } else if (first.name > second.name) { + return 1; + } + + // Finally, if we've gotten all the way here, then the two members must + // somehow be equal, and we'll just have to return a 0. + return 0; + }); + + return sortable; +} + interface Writable { write(code: CodeMaker): void; @@ -187,6 +235,10 @@ interface WithMembers { } +interface WithDependencies { + readonly depends_on: string[]; +} + interface PythonItem { readonly name: string; @@ -194,7 +246,7 @@ interface PythonItem { } -type ModuleMember = PythonItem & WithMembers & Writable; +type ModuleMember = PythonItem & WithMembers & WithDependencies & Writable; class BaseMethod implements PythonItem, Writable { @@ -308,11 +360,15 @@ class Interface implements ModuleMember { constructor(moduleName: string, name: string, bases: string[]) { this.moduleName = moduleName; this.name = name; - this.bases = bases; + this.members = []; } + get depends_on(): string[] { + return this.bases; + } + public addMember(member: PythonItem & Writable): PythonItem { this.members.push(member); return member; @@ -386,6 +442,10 @@ class Class implements ModuleMember { this.members = []; } + get depends_on(): string[] { + return []; + } + public addMember(member: PythonItem & Writable): PythonItem { this.members.push(member); return member; @@ -479,10 +539,7 @@ class Module { // Now that we've gotten all of the module header stuff done, we need to go // through and actually write out the meat of our module. - // TODO: We need to handle sorting our members prior to writing them out, so - // that we write out anything that a particular member depends on, prior - // to actually writing out that member. - for (let member of this.members) { + for (let member of (sortMembers(this.members)) as ModuleMember[]) { member.write(code); } From 4bf7672f06577e8502827c526ed42c0e219c0be8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 03:46:42 -0400 Subject: [PATCH 037/117] Re-enable tslint on python.ts --- packages/jsii-pacmak/lib/targets/python.ts | 193 ++++++++++----------- 1 file changed, 87 insertions(+), 106 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index f8a01a7f08..cb7224be88 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1,11 +1,10 @@ -/* tslint:disable */ import path = require('path'); import util = require('util'); +import { CodeMaker, toSnakeCase } from 'codemaker'; import * as spec from 'jsii-spec'; import { Generator, GeneratorOptions } from '../generator'; import { Target, TargetOptions } from '../target'; -import { CodeMaker, toSnakeCase } from 'codemaker'; import { shell } from '../util'; export default class Python extends Target { @@ -31,22 +30,21 @@ export default class Python extends Target { // ################## // # CODE GENERATOR # // ################## -const debug = function(o: any) { +const debug = (o: any) => { + // tslint:disable-next-line:no-console console.log(util.inspect(o, false, null, true)); -} - +}; -const PYTHON_BUILTIN_TYPES = ["bool", "str", "None"] +const PYTHON_BUILTIN_TYPES = ["bool", "str", "None"]; const PYTHON_KEYWORDS = [ "False", "None", "True", "and", "as", "assert", "async", "await", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return", "try", "while", "with", "yield" -] +]; - -function toPythonModuleName(name: string): string { +const toPythonModuleName = (name: string): string => { if (name.match(/^@[^/]+\/[^/]+$/)) { name = name.replace(/^@/g, ""); name = name.replace(/\//g, "."); @@ -55,10 +53,9 @@ function toPythonModuleName(name: string): string { name = toSnakeCase(name.replace(/-/g, "_")); return name; -} - +}; -function toPythonModuleFilename(name: string): string { +const toPythonModuleFilename = (name: string): string => { if (name.match(/^@[^/]+\/[^/]+$/)) { name = name.replace(/^@/g, ""); name = name.replace(/\//g, "."); @@ -67,24 +64,21 @@ function toPythonModuleFilename(name: string): string { name = name.replace(/\./g, "/"); return name; -} - +}; -function toPythonPackageName(name: string): string { +const toPythonPackageName = (name: string): string => { return toPythonModuleName(name).replace(/_/g, "-"); -} +}; - -function toPythonIdentifier(name: string): string { +const toPythonIdentifier = (name: string): string => { if (PYTHON_KEYWORDS.indexOf(name) > -1) { return name + "_"; } return name; -} - +}; -function toPythonType(typeref: spec.TypeReference): string { +const toPythonType = (typeref: spec.TypeReference): string => { if (spec.isPrimitiveTypeReference(typeref)) { return toPythonPrimitive(typeref.primitive); } else if (spec.isCollectionTypeReference(typeref)) { @@ -100,9 +94,9 @@ function toPythonType(typeref: spec.TypeReference): string { } else { throw new Error("Invalid type reference: " + JSON.stringify(typeref)); } -} +}; -function toPythonCollection(ref: spec.CollectionTypeReference) { +const toPythonCollection = (ref: spec.CollectionTypeReference) => { const elementPythonType = toPythonType(ref.collection.elementtype); switch (ref.collection.kind) { case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; @@ -110,44 +104,41 @@ function toPythonCollection(ref: spec.CollectionTypeReference) { default: throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); } -} +}; - -function toPythonPrimitive(primitive: spec.PrimitiveType): string { +const toPythonPrimitive = (primitive: spec.PrimitiveType): string => { switch (primitive) { case spec.PrimitiveType.Boolean: return "bool"; - case spec.PrimitiveType.Date: return "dateetime.datetime"; - case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; - case spec.PrimitiveType.Number: return "numbers.Number"; - case spec.PrimitiveType.String: return "str"; - case spec.PrimitiveType.Any: return "typing.Any"; + case spec.PrimitiveType.Date: return "dateetime.datetime"; + case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; + case spec.PrimitiveType.Number: return "numbers.Number"; + case spec.PrimitiveType.String: return "str"; + case spec.PrimitiveType.Any: return "typing.Any"; default: throw new Error("Unknown primitive type: " + primitive); } -} +}; - -function toPythonFQN(name: string): string { +const toPythonFQN = (name: string): string => { return name.split(".").map((cur, idx, arr) => { - if (idx == arr.length - 1) { + if (idx === arr.length - 1) { return toPythonIdentifier(cur); } else { return toPythonModuleName(cur); } }).join("."); -} - +}; -function formatPythonType(type: string, forwardReference: boolean = false, moduleName: string) { +const formatPythonType = (type: string, forwardReference: boolean = false, moduleName: string) => { // If we split our types by any of the "special" characters that can't appear in // identifiers (like "[],") then we will get a list of all of the identifiers, // no matter how nested they are. The downside is we might get trailing/leading // spaces or empty items so we'll need to trim and filter this list. - const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); + const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); - for (let innerType of types) { + for (const innerType of types) { // Built in types do not need formatted in any particular way. - if(PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { + if (PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { continue; } @@ -174,9 +165,9 @@ function formatPythonType(type: string, forwardReference: boolean = false, modul } return type; -} +}; -function sortMembers(sortable: (PythonItem & WithDependencies)[]): (PythonItem & WithDependencies)[] { +const sortMembers = (sortable: Array): Array => { // We're going to take a copy of our sortable item, because it'll make it easier if // this method doesn't have side effects. sortable = sortable.slice(); @@ -222,33 +213,27 @@ function sortMembers(sortable: (PythonItem & WithDependencies)[]): (PythonItem & }); return sortable; -} - +}; interface Writable { write(code: CodeMaker): void; } - interface WithMembers { addMember(member: PythonItem): PythonItem; } - interface WithDependencies { readonly depends_on: string[]; } - interface PythonItem { readonly name: string; requiredTypes(): string[]; } - type ModuleMember = PythonItem & WithMembers & WithDependencies & Writable; - class BaseMethod implements PythonItem, Writable { public readonly moduleName: string; @@ -270,7 +255,7 @@ class BaseMethod implements PythonItem, Writable { public requiredTypes(): string[] { const types: string[] = [this.getReturnType(this.returns)]; - for (let param of this.parameters) { + for (const param of this.parameters) { types.push(toPythonType(param.type)); } @@ -284,15 +269,15 @@ class BaseMethod implements PythonItem, Writable { // gradual typing, so we'll have to iterate over the list of parameters, and // build the list, converting as we go. // TODO: Handle imports (if needed) for all of these types. - let pythonParams: string[] = [this.implicitParameter]; - for (let param of this.parameters) { + const pythonParams: string[] = [this.implicitParameter]; + for (const param of this.parameters) { const paramName = toPythonIdentifier(param.name); const paramType = toPythonType(param.type); pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); } - if (this.decorator != undefined) { + if (this.decorator !== undefined) { code.line(`@${this.decorator}`); } @@ -306,7 +291,6 @@ class BaseMethod implements PythonItem, Writable { } } - class BaseProperty implements PythonItem, Writable { public readonly moduleName: string; @@ -337,25 +321,22 @@ class BaseProperty implements PythonItem, Writable { } } - class InterfaceMethod extends BaseMethod { protected readonly implicitParameter: string = "self"; } - class InterfaceProperty extends BaseProperty { protected readonly decorator: string = "property"; protected readonly implicitParameter: string = "self"; } - class Interface implements ModuleMember { public readonly moduleName: string; public readonly name: string; private bases: string[]; - private members: (PythonItem & Writable)[]; + private members: Array; constructor(moduleName: string, name: string, bases: string[]) { this.moduleName = moduleName; @@ -377,7 +358,7 @@ class Interface implements ModuleMember { public requiredTypes(): string[] { const types = this.bases.slice(); - for (let member of this.members) { + for (const member of this.members) { types.push(...member.requiredTypes()); } @@ -392,7 +373,7 @@ class Interface implements ModuleMember { code.openBlock(`class ${this.name}(${interfaceBases.join(",")})`); if (this.members.length > 0) { - for (let member of this.members) { + for (const member of this.members) { member.write(code); } } else { @@ -402,43 +383,38 @@ class Interface implements ModuleMember { } } - class StaticMethod extends BaseMethod { protected readonly decorator?: string = "_jsii_classmethod"; protected readonly implicitParameter: string = "cls"; } - class Method extends BaseMethod { protected readonly decorator?: string = "_jsii_method"; protected readonly implicitParameter: string = "self"; } - class StaticProperty extends BaseProperty { protected readonly decorator: string = "_jsii_classproperty"; protected readonly implicitParameter: string = "cls"; } - class Property extends BaseProperty { protected readonly decorator: string = "_jsii_property"; protected readonly implicitParameter: string = "self"; } - class Class implements ModuleMember { public readonly moduleName: string; public readonly name: string; - private jsii_fqn: string; - private members: (PythonItem & Writable)[]; + private jsiiFQN: string; + private members: Array; - constructor(moduleName: string, name: string, jsii_fqn: string) { + constructor(moduleName: string, name: string, jsiiFQN: string) { this.moduleName = moduleName; this.name = name; - this.jsii_fqn = jsii_fqn; + this.jsiiFQN = jsiiFQN; this.members = []; } @@ -454,7 +430,7 @@ class Class implements ModuleMember { public requiredTypes(): string[] { const types: string[] = []; - for (let member of this.members) { + for (const member of this.members) { types.push(...member.requiredTypes()); } @@ -465,9 +441,9 @@ class Class implements ModuleMember { // TODO: Data Types? // TODO: Bases - code.openBlock(`class ${this.name}(metaclass=_JSIIMeta, jsii_type="${this.jsii_fqn}")`); + code.openBlock(`class ${this.name}(metaclass=_JSIIMeta, jsii_type="${this.jsiiFQN}")`); if (this.members.length > 0) { - for (let member of this.members) { + for (const member of this.members) { member.write(code); } } else { @@ -477,20 +453,18 @@ class Class implements ModuleMember { } } - - class Module { - readonly name: string; - readonly assembly?: spec.Assembly; - readonly assemblyFilename?: string; + public readonly name: string; + public readonly assembly?: spec.Assembly; + public readonly assemblyFilename?: string; private members: ModuleMember[]; constructor(ns: string, assembly?: [spec.Assembly, string]) { this.name = ns; - if (assembly != undefined) { + if (assembly !== undefined) { this.assembly = assembly[0]; this.assemblyFilename = assembly[1]; } @@ -524,8 +498,8 @@ class Module { // Go over all of the modules that we need to import, and import them. // for (let [idx, modName] of this.importedModules.sort().entries()) { - for (let [idx, modName] of this.getRequiredTypeImports().sort().entries()) { - if (idx == 0) { + for (const [idx, modName] of this.getRequiredTypeImports().sort().entries()) { + if (idx === 0) { code.line(); } @@ -534,12 +508,18 @@ class Module { // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { - code.line(`__jsii_assembly__ = _JSIIAssembly.load("${this.assembly.name}", "${this.assembly.version}", __name__, "${this.assemblyFilename}")`); + code.line( + `__jsii_assembly__ = _JSIIAssembly.load(` + + `"${this.assembly.name}", ` + + `"${this.assembly.version}", ` + + `__name__, ` + + `"${this.assemblyFilename}")` + ); } // Now that we've gotten all of the module header stuff done, we need to go // through and actually write out the meat of our module. - for (let member of (sortMembers(this.members)) as ModuleMember[]) { + for (const member of (sortMembers(this.members)) as ModuleMember[]) { member.write(code); } @@ -548,36 +528,36 @@ class Module { } private getRequiredTypeImports(): string[] { - const types: string[] = [] + const types: string[] = []; const imports: string[] = []; // Compute a list of all of of the types that - for (let member of this.members) { + for (const member of this.members) { types.push(...member.requiredTypes()); } // Go over our types, and generate a list of imports that we need to import for // our module. - for (let type of types) { + for (const type of types) { // If we split our types by any of the "special" characters that can't appear in // identifiers (like "[],") then we will get a list of all of the identifiers, // no matter how nested they are. The downside is we might get trailing/leading // spaces or empty items so we'll need to trim and filter this list. - const subTypes = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s != ""); + const subTypes = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); // Loop over all of the types we've discovered, and check them for being // importable - for (let subType of subTypes) { + for (const subType of subTypes) { // For built in types, we don't need to do anything, and can just move on. if (PYTHON_BUILTIN_TYPES.indexOf(subType) > -1) { continue; } - let [, typeModule] = subType.match(/(.*)\.(.*)/) as any[]; + const [, typeModule] = subType.match(/(.*)\.(.*)/) as any[]; // Given a name like foo.bar.Frob, we want to import the module that Frob exists // in. Given that all classes exported by JSII have to be pascal cased, and all // of our imports are snake cases, this should be safe. We're going to double // check this though, to ensure that our importable here is safe. - if (typeModule != typeModule.toLowerCase()) { + if (typeModule !== typeModule.toLowerCase()) { // If we ever get to this point, we'll need to implment aliasing for our // imports. throw new Error(`Type module is not lower case: '${typeModule}'`); @@ -586,7 +566,7 @@ class Module { // We only want to actually import the type for this module, if it isn't the // module that we're currently in, otherwise we'll jus rely on the module scope // to make the name available to us. - if (typeModule != this.name && imports.indexOf(typeModule) == -1) { + if (typeModule !== this.name && imports.indexOf(typeModule) === -1) { imports.push(typeModule); } } @@ -673,7 +653,7 @@ class PythonGenerator extends Generator { this.code.line(`description="${assm.description}",`); this.code.line(`url="${assm.homepage}",`); this.code.line('package_dir={"": "src"},'); - this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`) + this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`); this.code.line(`package_data={"${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); this.code.line('python_requires=">=3.6",'); this.code.unindent(")"); @@ -689,41 +669,40 @@ class PythonGenerator extends Generator { // We also need to write out a MANIFEST.in to ensure that all of our required // files are included. - this.code.openFile("MANIFEST.in") - this.code.line("include pyproject.toml") - this.code.closeFile("MANIFEST.in") + this.code.openFile("MANIFEST.in"); + this.code.line("include pyproject.toml"); + this.code.closeFile("MANIFEST.in"); } protected onBeginNamespace(ns: string) { const moduleName = toPythonModuleName(ns); - const loadAssembly = this.assembly.name == ns ? true : false; + const loadAssembly = this.assembly.name === ns ? true : false; - let moduleArgs: any[] = []; + const moduleArgs: any[] = []; if (loadAssembly) { moduleArgs.push([this.assembly, this.getAssemblyFileName()]); } - let mod = new Module(moduleName, ...moduleArgs); + const mod = new Module(moduleName, ...moduleArgs); this.modules.push(mod); this.moduleStack.push(mod); } protected onEndNamespace(_ns: string) { - let module = this.moduleStack.pop() as Module; - let moduleFilename = path.join("src", toPythonModuleFilename(module.name), "__init__.py"); + const module = this.moduleStack.pop() as Module; + const moduleFilename = path.join("src", toPythonModuleFilename(module.name), "__init__.py"); this.code.openFile(moduleFilename); module.write(this.code); this.code.closeFile(moduleFilename); } - protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { + protected onBeginClass(cls: spec.ClassType, _abstract: boolean | undefined) { const currentModule = this.currentModule(); // TODO: Figure out what to do with abstract here. - abstract; this.currentMember = currentModule.addMember( new Class( @@ -817,10 +796,6 @@ class PythonGenerator extends Generator { ); } - private currentModule(): Module { - return this.moduleStack.slice(-1)[0]; - } - // Not Currently Used protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { @@ -842,4 +817,10 @@ class PythonGenerator extends Generator { debug("onStaticMethodOverload"); throw new Error("Unhandled Type: StaticMethodOverload"); } + + // End Not Currently Used + + private currentModule(): Module { + return this.moduleStack.slice(-1)[0]; + } } From 99fa04dc3308a3400b99d0a4ee649c316de55679 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 04:31:18 -0400 Subject: [PATCH 038/117] Cleanup interfaces for the nodes --- packages/jsii-pacmak/lib/targets/python.ts | 78 ++++++++++++---------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index cb7224be88..99ddeb8028 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -167,7 +167,7 @@ const formatPythonType = (type: string, forwardReference: boolean = false, modul return type; }; -const sortMembers = (sortable: Array): Array => { +const sortMembers = (sortable: PythonCollectionNode[]): PythonCollectionNode[] => { // We're going to take a copy of our sortable item, because it'll make it easier if // this method doesn't have side effects. sortable = sortable.slice(); @@ -215,26 +215,35 @@ const sortMembers = (sortable: Array): Array; + private members: PythonNode[]; constructor(moduleName: string, name: string, bases: string[]) { this.moduleName = moduleName; @@ -350,7 +359,7 @@ class Interface implements ModuleMember { return this.bases; } - public addMember(member: PythonItem & Writable): PythonItem { + public addMember(member: PythonNode): PythonNode { this.members.push(member); return member; } @@ -365,7 +374,7 @@ class Interface implements ModuleMember { return types; } - public write(code: CodeMaker) { + public emit(code: CodeMaker) { // TODO: Data Types? const interfaceBases = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); @@ -374,7 +383,7 @@ class Interface implements ModuleMember { code.openBlock(`class ${this.name}(${interfaceBases.join(",")})`); if (this.members.length > 0) { for (const member of this.members) { - member.write(code); + member.emit(code); } } else { code.line("pass"); @@ -403,12 +412,12 @@ class Property extends BaseProperty { protected readonly implicitParameter: string = "self"; } -class Class implements ModuleMember { +class Class implements PythonCollectionNode { public readonly moduleName: string; public readonly name: string; private jsiiFQN: string; - private members: Array; + private members: PythonNode[]; constructor(moduleName: string, name: string, jsiiFQN: string) { this.moduleName = moduleName; @@ -422,7 +431,7 @@ class Class implements ModuleMember { return []; } - public addMember(member: PythonItem & Writable): PythonItem { + public addMember(member: PythonNode): PythonNode { this.members.push(member); return member; } @@ -437,14 +446,14 @@ class Class implements ModuleMember { return types; } - public write(code: CodeMaker) { + public emit(code: CodeMaker) { // TODO: Data Types? // TODO: Bases code.openBlock(`class ${this.name}(metaclass=_JSIIMeta, jsii_type="${this.jsiiFQN}")`); if (this.members.length > 0) { for (const member of this.members) { - member.write(code); + member.emit(code); } } else { code.line("pass"); @@ -459,7 +468,7 @@ class Module { public readonly assembly?: spec.Assembly; public readonly assemblyFilename?: string; - private members: ModuleMember[]; + private members: PythonCollectionNode[]; constructor(ns: string, assembly?: [spec.Assembly, string]) { this.name = ns; @@ -472,13 +481,12 @@ class Module { this.members = []; } - public addMember(member: ModuleMember): ModuleMember { + public addMember(member: PythonCollectionNode): PythonCollectionNode { this.members.push(member); - return member; } - public write(code: CodeMaker) { + public emit(code: CodeMaker) { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. code.line(this.generateImportFrom("jsii.compat", ["Protocol"])); @@ -519,8 +527,8 @@ class Module { // Now that we've gotten all of the module header stuff done, we need to go // through and actually write out the meat of our module. - for (const member of (sortMembers(this.members)) as ModuleMember[]) { - member.write(code); + for (const member of sortMembers(this.members)) { + member.emit(code); } // // Whatever names we've exported, we'll write out our __all__ that lists them. @@ -602,7 +610,7 @@ class Module { class PythonGenerator extends Generator { - private currentMember?: ModuleMember; + private currentMember?: PythonCollectionNode; private modules: Module[]; private moduleStack: Module[]; @@ -695,7 +703,7 @@ class PythonGenerator extends Generator { const moduleFilename = path.join("src", toPythonModuleFilename(module.name), "__init__.py"); this.code.openFile(moduleFilename); - module.write(this.code); + module.emit(this.code); this.code.closeFile(moduleFilename); } From 34098504d7de6033a54fee55b2ad5236dd601673 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 30 Sep 2018 17:50:17 -0400 Subject: [PATCH 039/117] Fix sorting by dependency --- packages/jsii-pacmak/lib/targets/python.ts | 87 ++++++++++++---------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 99ddeb8028..8c6bc06266 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -167,53 +167,45 @@ const formatPythonType = (type: string, forwardReference: boolean = false, modul return type; }; +const setDifference = (setA: Set, setB: Set): Set => { + const difference = new Set(setA); + for (const elem of setB) { + difference.delete(elem); + } + return difference; +}; + const sortMembers = (sortable: PythonCollectionNode[]): PythonCollectionNode[] => { + const sorted: PythonCollectionNode[] = []; + const sortedFQNs: Set = new Set(); + // We're going to take a copy of our sortable item, because it'll make it easier if // this method doesn't have side effects. sortable = sortable.slice(); - // Actually sort our now copied array. - sortable.sort((first, second): number => { - // There are 4 possible states that the first and second members could be in: - // 1. Neither member depends on the other. - // 2. The left member depends on the right member. - // 3. The right member depends on the left member. - // 4. The two members depends on each other. - // - // In the case of (1), we can't determine ordering by using the dependencies - // so we'll move along and fall back to another ordering mechanism. - // - // In the case of (2), then we want the right member to come first, so that - // we render it prior to the left member. The opposite is true for (3). - // - // In the case of (4), we've got a cyclic dependency, and we have to error - // out because there's no way for us to represent that. - if (first.depends_on.indexOf(second.name) > -1 && second.depends_on.indexOf(first.name) > -1) { - throw new Error(`${first.name} and ${second.name} have a cyclic dependency and cannot be rendered.`); - } else if (first.depends_on.indexOf(second.name)) { - return 1; - } else if (second.depends_on.indexOf(first.name)) { - return -1; + while (sortable.length > 0) { + let idx: number | undefined; + + for (const [idx2, item] of sortable.entries()) { + if (setDifference(new Set(item.depends_on), sortedFQNs).size === 0) { + sorted.push(item); + sortedFQNs.add(item.fqn); + idx = idx2; + break; + } else { + idx = undefined; + } } - // If we've gotten here, then the two members given to us do not depend on - // each other. Perhaps in the future we could be smarter and try to do a - // non mandatory dependency so Type Hints might not need forward references - // in *every* case... however for now we'll just do the simpliest thing, and - // sort the two items alphabetically. - if (first.name < second.name) { - return -1; - } else if (first.name > second.name) { - return 1; + if (idx === undefined) { + throw new Error("Could not sort members."); + } else { + sortable.splice(idx, 1); } + } - // Finally, if we've gotten all the way here, then the two members must - // somehow be equal, and we'll just have to return a 0. - return 0; - }); - - return sortable; -}; + return sorted; + }; interface PythonNode { @@ -223,6 +215,9 @@ interface PythonNode { // The name of the given Node. readonly name: string; + // The fully qualifed name of this node. + readonly fqn: string; + // Returns a list of all of the FQN Python types that this Node requires, this // should traverse all of it's members to get the full list of all types required to // exist (i.e. be imported). @@ -261,6 +256,10 @@ class BaseMethod implements PythonNode { this.returns = returns; } + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + public requiredTypes(): string[] { const types: string[] = [this.getReturnType(this.returns)]; @@ -316,6 +315,10 @@ class BaseProperty implements PythonNode { this.type = type; } + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + public requiredTypes(): string[] { return [toPythonType(this.type)]; } @@ -355,6 +358,10 @@ class Interface implements PythonCollectionNode { this.members = []; } + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + get depends_on(): string[] { return this.bases; } @@ -427,6 +434,10 @@ class Class implements PythonCollectionNode { this.members = []; } + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + get depends_on(): string[] { return []; } From 912a593ad5d4a9997b35d097d66d8603bd4837c1 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 10 Oct 2018 13:46:43 -0400 Subject: [PATCH 040/117] Support passing arguments to the class constructor --- packages/jsii-python-runtime/src/jsii/_kernel/__init__.py | 7 +++++-- .../src/jsii/_kernel/providers/process.py | 8 +++++++- packages/jsii-python-runtime/src/jsii/runtime.py | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 4bf1270923..c64e6dc08e 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -67,8 +67,11 @@ def load(self, name: str, version: str, tarball: str) -> None: self.provider.load(LoadRequest(name=name, version=version, tarball=tarball)) # TODO: Can we do protocols in typing? - def create(self, klass: Any) -> ObjRef: - return self.provider.create(CreateRequest(fqn=klass.__jsii_type__)) + def create(self, klass: Any, args: Optional[List[Any]] = None) -> ObjRef: + if args is None: + args = [] + + return self.provider.create(CreateRequest(fqn=klass.__jsii_type__, args=args)) def delete(self, ref: ObjRef) -> None: self.provider.delete(DeleteRequest(objref=ref)) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 55b5808570..5087d407cd 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -92,6 +92,12 @@ def ohook(d): return d +def jdefault(obj): + if hasattr(obj, "__jsii_ref__"): + return _unstructure_ref(obj.__jsii_ref__) + raise TypeError + + class _NodeProcess: def __init__(self): self._serializer = cattr.Converter() @@ -224,7 +230,7 @@ def send( # #python-attrs/attrs#429 fixed. if "property_" in req_dict: req_dict["property"] = req_dict.pop("property_") - data = json.dumps(req_dict).encode("utf8") + data = json.dumps(req_dict, default=jdefault).encode("utf8") # Send our data, ensure that it is framed with a trailing \n self._process.stdin.write(b"%b\n" % (data,)) diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py index f31e7e2a45..dbee37883c 100644 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ b/packages/jsii-python-runtime/src/jsii/runtime.py @@ -84,10 +84,10 @@ def __call__(cls, *args, **kwargs): # Create our object at the JS level. # TODO: Handle args/kwargs # TODO: Handle Overrides - ref = cls.__jsii_kernel__.create(cls) + ref = cls.__jsii_kernel__.create(cls, args=args) # Create our object at the Python level. - obj = cls.__class__.from_reference(cls, ref, *args, **kwargs) + obj = cls.__class__.from_reference(cls, ref, **kwargs) # Whenever the object we're creating gets garbage collected, then we want to # delete it from the JS runtime as well. @@ -98,7 +98,7 @@ def __call__(cls, *args, **kwargs): # Instatiate our object at the Python level. if isinstance(obj, cls): - obj.__init__(*args, **kwargs) + obj.__init__(**kwargs) return obj From be62f7cd46c0cf0f933ff34d2ede6ba3a693eda2 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 10 Oct 2018 13:47:17 -0400 Subject: [PATCH 041/117] Handle FQN that contain a @ sign --- packages/jsii-python-runtime/src/jsii/_reference_map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index c04d74eeaa..47bfdd49f5 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -28,7 +28,7 @@ def resolve(self, ref): # If we got to this point, then we didn't have a referene for this, in that case # we want to create a new instance, but we need to create it in such a way that # we don't try to recreate the type inside of the JSII interface. - class_ = _types[ref.ref.split("@", 1)[0]] + class_ = _types[ref.ref.rsplit("@", 1)[0]] return class_.__class__.from_reference(class_, ref) From 44c43f4059647a83309fb8d26dde29438eaa9063 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 10 Oct 2018 16:56:39 -0400 Subject: [PATCH 042/117] Update the JSII Provider Version Number --- .../jsii-python-runtime/src/jsii/_kernel/providers/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 5087d407cd..718de28e7c 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -219,7 +219,7 @@ def handshake(self): # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.7.6" + resp.hello == "jsii-runtime@0.7.7" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( From bac9dc706a949c1979200f0ba220d08a33221d00 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 16 Oct 2018 20:33:23 -0400 Subject: [PATCH 043/117] Interfaces only need to declare dependencies in the same module --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8c6bc06266..934404246a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -363,7 +363,7 @@ class Interface implements PythonCollectionNode { } get depends_on(): string[] { - return this.bases; + return this.bases.filter(base => base.startsWith(this.moduleName + ".")); } public addMember(member: PythonNode): PythonNode { From 379d83157d1b7d84f502da233957a004a4f29069 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 16 Oct 2018 23:43:48 -0400 Subject: [PATCH 044/117] Implement Enums in the Python generator --- packages/jsii-pacmak/lib/targets/python.ts | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 934404246a..ee3360ea09 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -473,6 +473,73 @@ class Class implements PythonCollectionNode { } } +class Enum implements PythonCollectionNode { + public readonly moduleName: string; + public readonly name: string; + + private members: PythonNode[]; + + constructor(moduleName: string, name: string) { + this.moduleName = moduleName; + this.name = name; + this.members = []; + } + + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + + get depends_on(): string[] { + return []; + } + + public addMember(member: PythonNode): PythonNode { + this.members.push(member); + return member; + } + + public requiredTypes(): string[] { + return ["enum.Enum"]; + } + + public emit(code: CodeMaker) { + code.openBlock(`class ${this.name}(enum.Enum)`); + if (this.members.length > 0) { + for (const member of this.members) { + member.emit(code); + } + } else { + code.line("pass"); + } + code.closeBlock(); + } +} + +class EnumMember implements PythonNode { + public readonly moduleName: string; + public readonly name: string; + + private readonly value: string; + + constructor(moduleName: string, name: string, value: string) { + this.moduleName = moduleName; + this.name = name; + this.value = value; + } + + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + + public requiredTypes(): string[] { + return []; + } + + public emit(code: CodeMaker) { + code.line(`${this.name} = "${this.value}"`); + } +} + class Module { public readonly name: string; @@ -815,6 +882,31 @@ class PythonGenerator extends Generator { ); } + protected onBeginEnum(enm: spec.EnumType) { + const currentModule = this.currentModule(); + + this.currentMember = currentModule.addMember( + new Enum( + currentModule.name, + toPythonIdentifier(enm.name), + ) + ); + } + + protected onEndEnum(_enm: spec.EnumType) { + this.currentMember = undefined; + } + + protected onEnumMember(_enm: spec.EnumType, member: spec.EnumMember) { + this.currentMember!.addMember( + new EnumMember( + this.currentModule().name, + toPythonIdentifier(member.name), + member.name + ) + ); + } + // Not Currently Used protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { From 4fdda680d9bd6a0ce1799ec6792930e5602e01bd Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 16 Oct 2018 23:44:59 -0400 Subject: [PATCH 045/117] Default to None if there is no result from an Invoke --- packages/jsii-python-runtime/src/jsii/_kernel/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index 095153ac8c..961e2bdf7c 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -122,7 +122,7 @@ class InvokeRequest: @attr.s(auto_attribs=True, frozen=True, slots=True) class InvokeResponse: - result: Any + result: Any = None @attr.s(auto_attribs=True, frozen=True, slots=True) From 8f93d692a6ec34b259cc231dee3a1f23fa640a59 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 17 Oct 2018 00:25:00 -0400 Subject: [PATCH 046/117] Fix a spelling mistake --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index ee3360ea09..0275807cfb 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -109,7 +109,7 @@ const toPythonCollection = (ref: spec.CollectionTypeReference) => { const toPythonPrimitive = (primitive: spec.PrimitiveType): string => { switch (primitive) { case spec.PrimitiveType.Boolean: return "bool"; - case spec.PrimitiveType.Date: return "dateetime.datetime"; + case spec.PrimitiveType.Date: return "datetime.datetime"; case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; case spec.PrimitiveType.Number: return "numbers.Number"; case spec.PrimitiveType.String: return "str"; From 18ba6e6e41bf49121b3788df14746be54440b8d8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 18 Oct 2018 01:27:55 -0400 Subject: [PATCH 047/117] Make sure all dependencies have been imported --- packages/jsii-pacmak/lib/targets/python.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 0275807cfb..e2b911e497 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -658,6 +658,18 @@ class Module { } } + // Add the additional dependencies that we require in order for imports to + // work correctly. These are dependencies at the JS level, isntead of at the + // Python level. + if (this.assembly !== undefined && this.assembly!.dependencies !== undefined) { + for (const depName of Object.keys(this.assembly!.dependencies!)) { + const moduleName = toPythonModuleName(depName); + if (imports.indexOf(moduleName) === -1) { + imports.push(moduleName); + } + } + } + return imports; } From 83929ef9210cbd541cc04fe0a8c9324d006d273a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 18:42:07 -0400 Subject: [PATCH 048/117] Magical Removal Greatly simplify the implementation by removing the magic decorators and pushing more of the work into the generated Python code. This makes the generated Python code have more noise to seeing the structure of the API but it means that there is less magic happening behind the scenes. This also makes it better for tools like MyPy since this code more more like "normal" Python code. --- packages/jsii-pacmak/lib/targets/python.ts | 94 +++++-- .../jsii-python-runtime/src/jsii/__init__.py | 31 +++ .../src/jsii/_kernel/__init__.py | 30 ++- .../src/jsii/_kernel/types.py | 20 ++ .../jsii-python-runtime/src/jsii/_runtime.py | 93 +++++++ .../jsii-python-runtime/src/jsii/python.py | 38 +++ .../jsii-python-runtime/src/jsii/runtime.py | 244 ------------------ 7 files changed, 271 insertions(+), 279 deletions(-) create mode 100644 packages/jsii-python-runtime/src/jsii/_runtime.py create mode 100644 packages/jsii-python-runtime/src/jsii/python.py delete mode 100644 packages/jsii-python-runtime/src/jsii/runtime.py diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index e2b911e497..2245940cd3 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -246,8 +246,8 @@ class BaseMethod implements PythonNode { protected readonly decorator?: string; protected readonly implicitParameter: string; - private readonly parameters: spec.Parameter[]; - private readonly returns?: spec.TypeReference; + protected readonly parameters: spec.Parameter[]; + protected readonly returns?: spec.TypeReference; constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { this.moduleName = moduleName; @@ -290,10 +290,14 @@ class BaseMethod implements PythonNode { } code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); + this.emitBody(code); code.closeBlock(); } + protected emitBody(code: CodeMaker) { + code.line("..."); + } + private getReturnType(type?: spec.TypeReference): string { return type ? toPythonType(type) : "None"; } @@ -308,11 +312,13 @@ class BaseProperty implements PythonNode { protected readonly implicitParameter: string; private readonly type: spec.TypeReference; + private readonly immutable: boolean; - constructor(moduleName: string, name: string, type: spec.TypeReference) { + constructor(moduleName: string, name: string, type: spec.TypeReference, immutable: boolean) { this.moduleName = moduleName; this.name = name; this.type = type; + this.immutable = immutable; } get fqn(): string { @@ -328,8 +334,23 @@ class BaseProperty implements PythonNode { code.line(`@${this.decorator}`); code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - code.line("..."); + this.emitGetterBody(code); code.closeBlock(); + + if (!this.immutable) { + code.line(`@${this.name}.setter`); + code.openBlock(`def ${this.name}(${this.implicitParameter}, value: ${formatPythonType(returnType, false, this.moduleName)})`); + this.emitSetterBody(code); + code.closeBlock(); + } + } + + protected emitGetterBody(code: CodeMaker) { + code.line("..."); + } + + protected emitSetterBody(code: CodeMaker) { + code.line("..."); } } @@ -400,23 +421,56 @@ class Interface implements PythonCollectionNode { } class StaticMethod extends BaseMethod { - protected readonly decorator?: string = "_jsii_classmethod"; + protected readonly decorator?: string = "classmethod"; protected readonly implicitParameter: string = "cls"; + + protected emitBody(code: CodeMaker) { + const paramNames: string[] = []; + for (const param of this.parameters) { + paramNames.push(toPythonIdentifier(param.name)); + } + + code.line(`return jsii.sinvoke(${this.implicitParameter}, "${this.name}", [${paramNames.join(", ")}])`); + } } class Method extends BaseMethod { - protected readonly decorator?: string = "_jsii_method"; protected readonly implicitParameter: string = "self"; + + protected emitBody(code: CodeMaker) { + const paramNames: string[] = []; + for (const param of this.parameters) { + paramNames.push(toPythonIdentifier(param.name)); + } + + code.line(`return jsii.invoke(${this.implicitParameter}, "${this.name}", [${paramNames.join(", ")}])`); + } } class StaticProperty extends BaseProperty { - protected readonly decorator: string = "_jsii_classproperty"; + protected readonly decorator: string = "classproperty"; protected readonly implicitParameter: string = "cls"; + + protected emitGetterBody(code: CodeMaker) { + code.line(`return jsii.sget(${this.implicitParameter}, "${this.name}")`); + } + + protected emitSetterBody(code: CodeMaker) { + code.line(`return jsii.sset(${this.implicitParameter}, "${this.name}", value)`); + } } class Property extends BaseProperty { - protected readonly decorator: string = "_jsii_property"; + protected readonly decorator: string = "property"; protected readonly implicitParameter: string = "self"; + + protected emitGetterBody(code: CodeMaker) { + code.line(`return jsii.get(${this.implicitParameter}, "${this.name}")`); + } + + protected emitSetterBody(code: CodeMaker) { + code.line(`return jsii.set(${this.implicitParameter}, "${this.name}", value)`); + } } class Class implements PythonCollectionNode { @@ -461,7 +515,7 @@ class Class implements PythonCollectionNode { // TODO: Data Types? // TODO: Bases - code.openBlock(`class ${this.name}(metaclass=_JSIIMeta, jsii_type="${this.jsiiFQN}")`); + code.openBlock(`class ${this.name}(metaclass=jsii.JSIIMeta, jsii_type="${this.jsiiFQN}")`); if (this.members.length > 0) { for (const member of this.members) { member.emit(code); @@ -567,20 +621,9 @@ class Module { public emit(code: CodeMaker) { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. + code.line("import jsii"); code.line(this.generateImportFrom("jsii.compat", ["Protocol"])); - code.line( - this.generateImportFrom( - "jsii.runtime", - [ - "JSIIAssembly", - "JSIIMeta", - "jsii_method", - "jsii_property", - "jsii_classmethod", - "jsii_classproperty", - ] - ) - ); + code.line("from jsii.python import classproperty"); // Go over all of the modules that we need to import, and import them. // for (let [idx, modName] of this.importedModules.sort().entries()) { @@ -595,7 +638,7 @@ class Module { // Determine if we need to write out the kernel load line. if (this.assembly && this.assemblyFilename) { code.line( - `__jsii_assembly__ = _JSIIAssembly.load(` + + `__jsii_assembly__ = jsii.JSIIAssembly.load(` + `"${this.assembly.name}", ` + `"${this.assembly.version}", ` + `__name__, ` + @@ -843,6 +886,7 @@ class PythonGenerator extends Generator { this.currentModule().name, toPythonIdentifier(prop.name!), prop.type, + prop.immutable || false ) ); } @@ -853,6 +897,7 @@ class PythonGenerator extends Generator { this.currentModule().name, toPythonIdentifier(prop.name!), prop.type, + prop.immutable || false, ) ); } @@ -890,6 +935,7 @@ class PythonGenerator extends Generator { this.currentModule().name, toPythonIdentifier(prop.name!), prop.type, + true, ) ); } diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index e69de29bb2..39e6dd8f21 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -0,0 +1,31 @@ +from ._runtime import JSIIAssembly, JSIIMeta, kernel + + +# Alias our Kernel methods here, so that jsii. works. This will hide the fact +# that there is a kernel at all from our callers. +load = kernel.load +create = kernel.create +delete = kernel.delete +get = kernel.get +set = kernel.set +sget = kernel.sget +sset = kernel.sset +invoke = kernel.invoke +sinvoke = kernel.sinvoke +stats = kernel.stats + + +__all__ = [ + "JSIIAssembly", + "JSIIMeta", + "load", + "create", + "delete", + "get", + "set", + "sget", + "sset", + "invoke", + "sinvoke", + "stats", +] diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index c64e6dc08e..9ba82e3504 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -8,6 +8,7 @@ from jsii import _reference_map from jsii._utils import Singleton from jsii._kernel.providers import BaseKernel, ProcessKernel +from jsii._kernel.types import JSClass, Referenceable from jsii._kernel.types import ( LoadRequest, CreateRequest, @@ -66,8 +67,7 @@ def __init__(self, provider_class: Type[BaseKernel] = ProcessKernel) -> None: def load(self, name: str, version: str, tarball: str) -> None: self.provider.load(LoadRequest(name=name, version=version, tarball=tarball)) - # TODO: Can we do protocols in typing? - def create(self, klass: Any, args: Optional[List[Any]] = None) -> ObjRef: + def create(self, klass: JSClass, args: Optional[List[Any]] = None) -> ObjRef: if args is None: args = [] @@ -77,34 +77,42 @@ def delete(self, ref: ObjRef) -> None: self.provider.delete(DeleteRequest(objref=ref)) @_dereferenced - def get(self, ref: ObjRef, property: str) -> Any: - return self.provider.get(GetRequest(objref=ref, property_=property)).value + def get(self, obj: Referenceable, property: str) -> Any: + return self.provider.get( + GetRequest(objref=obj.__jsii_ref__, property_=property) + ).value - def set(self, ref: ObjRef, property: str, value: Any) -> None: - self.provider.set(SetRequest(objref=ref, property_=property, value=value)) + def set(self, obj: Referenceable, property: str, value: Any) -> None: + self.provider.set( + SetRequest(objref=obj.__jsii_ref__, property_=property, value=value) + ) @_dereferenced - def sget(self, klass: Any, property: str) -> Any: + def sget(self, klass: JSClass, property: str) -> Any: return self.provider.sget( StaticGetRequest(fqn=klass.__jsii_type__, property_=property) ).value - def sset(self, klass: Any, property: str, value: Any) -> None: + def sset(self, klass: JSClass, property: str, value: Any) -> None: self.provider.sset( StaticSetRequest(fqn=klass.__jsii_type__, property_=property, value=value) ) @_dereferenced - def invoke(self, ref: ObjRef, method: str, args: Optional[List[Any]] = None) -> Any: + def invoke( + self, obj: Referenceable, method: str, args: Optional[List[Any]] = None + ) -> Any: if args is None: args = [] return self.provider.invoke( - InvokeRequest(objref=ref, method=method, args=args) + InvokeRequest(objref=obj.__jsii_ref__, method=method, args=args) ).result @_dereferenced - def sinvoke(self, klass: Any, method: str, args: Optional[List[Any]] = None) -> Any: + def sinvoke( + self, klass: JSClass, method: str, args: Optional[List[Any]] = None + ) -> Any: if args is None: args = [] diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index 961e2bdf7c..84fe8e8638 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -2,6 +2,8 @@ import attr +from jsii.compat import Protocol + # TODO: # - HelloResponse @@ -228,3 +230,21 @@ class StatsResponse: InvokeResponse, StatsResponse, ] + + +class JSClass(Protocol): + + @property + def __jsii_type__(self) -> str: + """ + Returns a str that points to this class inside of the Javascript runtime. + """ + + +class Referenceable(Protocol): + + @property + def __jsii_ref__(self) -> ObjRef: + """ + Returns an ObjRef that points to this object on the JS side. + """ diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py new file mode 100644 index 0000000000..2c51cd2939 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -0,0 +1,93 @@ +import weakref +import os + +import attr + +from jsii import _reference_map +from jsii._compat import importlib_resources +from jsii._kernel import Kernel +from jsii.python import _ClassPropertyMeta + + +# Yea, a global here is kind of gross, however, there's not really a better way of +# handling this. Fundamentally this is a global value, since we can only reasonably +# have a single kernel active at any one time in a real program. +kernel = Kernel() + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class JSIIAssembly: + + name: str + version: str + module: str + filename: str + + @classmethod + def load(cls, *args, _kernel=kernel, **kwargs): + # Our object here really just acts as a record for our JSIIAssembly, it doesn't + # offer any functionality itself, besides this class method that will trigger + # the loading of the given assembly in the JSII Kernel. + assembly = cls(*args, **kwargs) + + # Actually load the assembly into the kernel, we're using the + # importlib.resources API here isntead of manually constructing the path, in + # the hopes that this will make JSII modules able to be used with zipimport + # instead of only on the FS. + with importlib_resources.path( + f"{assembly.module}._jsii", assembly.filename + ) as assembly_path: + _kernel.load(assembly.name, assembly.version, os.fspath(assembly_path)) + + # Give our record of the assembly back to the caller. + return assembly + + +class JSIIMeta(_ClassPropertyMeta, type): + def __new__(cls, name, bases, attrs, *, jsii_type): + # TODO: We need to figure out exactly what we're going to do this the kernel + # here. Right now we're "creating" a new one per type, and relying on + # the fact it's a singleton so that everything is in the same kernel. + # That might not make complete sense though, particularly if we ever + # want to have multiple kernels in a single process (does that even + # make sense?). Perhaps we should pass it in like we pass the type, and + # have the autogenerated code either create it once per library or once + # per process. + attrs["__jsii_kernel__"] = kernel + attrs["__jsii_type__"] = jsii_type + + obj = super().__new__(name, bases, attrs) + + _reference_map.register_type(obj.__jsii_type__, obj) + + return obj + + def __call__(cls, *args, **kwargs): + # Create our object at the JS level. + # TODO: Handle args/kwargs + # TODO: Handle Overrides + ref = cls.__jsii_kernel__.create(cls, args=args) + + # Create our object at the Python level. + obj = cls.__class__.from_reference(cls, ref, **kwargs) + + # Whenever the object we're creating gets garbage collected, then we want to + # delete it from the JS runtime as well. + # TODO: Figure out if this is *really* true, what happens if something goes + # out of scope at the Python level, but something is holding onto it + # at the JS level? What mechanics are in place for this if any? + weakref.finalize(obj, cls.__jsii_kernel__.delete, obj.__jsii_ref__) + + # Instatiate our object at the Python level. + if isinstance(obj, cls): + obj.__init__(**kwargs) + + return obj + + def from_reference(cls, ref, *args, **kwargs): + obj = cls.__new__(cls, *args, **kwargs) + obj.__jsii_ref__ = ref + + _reference_map.register_reference(obj.__jsii_ref__.ref, obj) + + return obj diff --git a/packages/jsii-python-runtime/src/jsii/python.py b/packages/jsii-python-runtime/src/jsii/python.py new file mode 100644 index 0000000000..406e738ca6 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/python.py @@ -0,0 +1,38 @@ +class _ClassProperty: + def __init__(self, fget, fset=None): + self.fget = fget + self.fset = fset + + def __get__(self, obj, klass=None): + if klass is None: + klass = type(obj) + return self.fget.__get__(obj, klass)() + + def __set__(self, obj, value): + if not self.fset: + raise AttributeError("Can't set attribute.") + + klass = type(obj) + return self.fset.__get__(obj, klass)(value) + + def setter(self, func): + if not isinstance(func, (classmethod, staticmethod)): + func = classmethod(func) + + self.fset = func + + return self + + +def classproperty(func): + return _ClassProperty(func) + + +class _ClassPropertyMeta(type): + + def __setattr__(self, key, value): + obj = getattr(self, key, None) + if isinstance(obj, _ClassProperty): + return obj.__set__(self, value) + + return super().__setattr__(key, value) diff --git a/packages/jsii-python-runtime/src/jsii/runtime.py b/packages/jsii-python-runtime/src/jsii/runtime.py deleted file mode 100644 index dbee37883c..0000000000 --- a/packages/jsii-python-runtime/src/jsii/runtime.py +++ /dev/null @@ -1,244 +0,0 @@ -from typing import Any, Callable, TypeVar - -import typing -import weakref -import os - -import attr - -from jsii import _reference_map -from jsii._compat import importlib_resources -from jsii._kernel import Kernel - - -# Yea, a global here is kind of gross, however, there's not really a better way of -# handling this. Fundamentally this is a global value, since we can only reasonably -# have a single kernel active at any one time in a real program. -kernel = Kernel() - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class JSIIAssembly: - - name: str - version: str - module: str - filename: str - - @classmethod - def load(cls, *args, _kernel=kernel, **kwargs): - # Our object here really just acts as a record for our JSIIAssembly, it doesn't - # offer any functionality itself, besides this class method that will trigger - # the loading of the given assembly in the JSII Kernel. - assembly = cls(*args, **kwargs) - - # Actually load the assembly into the kernel, we're using the - # importlib.resources API here isntead of manually constructing the path, in - # the hopes that this will make JSII modules able to be used with zipimport - # instead of only on the FS. - with importlib_resources.path( - f"{assembly.module}._jsii", assembly.filename - ) as assembly_path: - _kernel.load(assembly.name, assembly.version, os.fspath(assembly_path)) - - # Give our record of the assembly back to the caller. - return assembly - - -class JSIIMeta(type): - def __new__(cls, name, bases, attrs, *, jsii_type): - # TODO: We need to figure out exactly what we're going to do this the kernel - # here. Right now we're "creating" a new one per type, and relying on - # the fact it's a singleton so that everything is in the same kernel. - # That might not make complete sense though, particularly if we ever - # want to have multiple kernels in a single process (does that even - # make sense?). Perhaps we should pass it in like we pass the type, and - # have the autogenerated code either create it once per library or once - # per process. - attrs["__jsii_kernel__"] = kernel - attrs["__jsii_type__"] = jsii_type - - # We need to lift all of the classproperty instances out of the class, because - # they need to actually be set *on* the metaclass.. which is us. However we - # don't want to have to derive a separate metaclass for each class, so instead - # we're going to dynamically handle these. - class_properties, new_attrs = {}, {} - for key, value in attrs.items(): - if isinstance(value, jsii_classproperty): - class_properties[key] = value - else: - new_attrs[key] = value - new_attrs["__jsii_class_properties__"] = class_properties - - obj = type.__new__(cls, name, bases, new_attrs) - - # We need to go through an implement the __set_name__ portion of our API. - for key, value in obj.__jsii_class_properties__.items(): - value.__set_name__(obj, key) - - _reference_map.register_type(obj.__jsii_type__, obj) - - return obj - - def __call__(cls, *args, **kwargs): - # Create our object at the JS level. - # TODO: Handle args/kwargs - # TODO: Handle Overrides - ref = cls.__jsii_kernel__.create(cls, args=args) - - # Create our object at the Python level. - obj = cls.__class__.from_reference(cls, ref, **kwargs) - - # Whenever the object we're creating gets garbage collected, then we want to - # delete it from the JS runtime as well. - # TODO: Figure out if this is *really* true, what happens if something goes - # out of scope at the Python level, but something is holding onto it - # at the JS level? What mechanics are in place for this if any? - weakref.finalize(obj, cls.__jsii_kernel__.delete, obj.__jsii_ref__) - - # Instatiate our object at the Python level. - if isinstance(obj, cls): - obj.__init__(**kwargs) - - return obj - - def from_reference(cls, ref, *args, **kwargs): - obj = cls.__new__(cls, *args, **kwargs) - obj.__jsii_ref__ = ref - - _reference_map.register_reference(obj.__jsii_ref__.ref, obj) - - return obj - - def __getattr__(obj, name): - if name in obj.__jsii_class_properties__: - return obj.__jsii_class_properties__[name].__get__(obj, None) - - raise AttributeError(f"type object {obj.__name__!r} has no attribute {name!r}") - - def __setattr__(obj, name, value): - if name in obj.__jsii_class_properties__: - return obj.__jsii_class_properties__[name].__set__(obj, value) - - return super().__setattr__(name, value) - - -# NOTE: We do this goofy thing so that typing works on our generated stub classes, -# because MyPy does not currently understand the decorator protocol very well. -# Something like https://github.com/python/peps/pull/242 should make this no -# longer required. -if typing.TYPE_CHECKING: - jsii_property = property -else: - # The naming is a little funky on this, since it's a class but named like a - # function. This is done to better mimic other decorators like @proeprty. - class jsii_property: - - # We throw away the getter function here, because it doesn't really matter or - # provide us with anything useful. It exists only to provide a way to pass - # naming into us, and so that consumers of this library can "look at the - # source" and at least see something that resembles the structure of the - # library they're using, even though it won't have any of the body of the code. - def __init__(self, getter): - pass - - # TODO: Figure out a way to let the caller of this override the name. This might - # be useful in cases where the name that the JS level code is using isn't - # a valid python identifier, but we still want to be able to bind it, and - # doing so would require giving it a different name at the Python level. - def __set_name__(self, owner, name): - self.name = name - - def __get__(self, instance, owner): - return instance.__jsii_kernel__.get(instance.__jsii_ref__, self.name) - - def __set__(self, instance, value): - instance.__jsii_kernel__.set(instance.__jsii_ref__, self.name, value) - - -class _JSIIMethod: - def __init__(self, obj, method_name): - self.obj = obj - self.method_name = method_name - - def __call__(self, *args): - kernel = self.obj.__jsii_kernel__ - return kernel.invoke(self.obj.__jsii_ref__, self.method_name, args) - - -# NOTE: We do this goofy thing so that typing works on our generated stub classes, -# because MyPy does not currently understand the decorator protocol very well. -# Something like https://github.com/python/peps/pull/242 should make this no -# longer required. -if typing.TYPE_CHECKING: - F = TypeVar("F", bound=Callable[..., Any]) - - def jsii_method(func: F) -> F: - ... - - -else: - # Again, the naming is a little funky on this, since it's a class but named like a - # function. This is done to better mimic other decorators like @classmethod. - class jsii_method: - - # Again, we're throwing away the actual function body, because it exists only - # to provide the structure of the library for people who read the code, and a - # way to pass the name/typing signatures through. - def __init__(self, meth): - pass - - # TODO: Figure out a way to let the caller of this override the name. This might - # be useful in cases where the name that the JS level code is using isn't - # a valid python identifier, but we still want to be able to bind it, and - # doing so would require giving it a different name at the Python level. - def __set_name__(self, owner, name): - self.name = name - - def __get__(self, instance, owner): - return _JSIIMethod(instance, self.name) - - -class _JSIIClassMethod: - def __init__(self, klass, method_name): - self.klass = klass - self.method_name = method_name - - def __call__(self, *args): - kernel = self.klass.__jsii_kernel__ - return kernel.sinvoke(self.klass, self.method_name, args) - - -if typing.TYPE_CHECKING: - jsii_classmethod = classmethod -else: - - class jsii_classmethod: - def __init__(self, meth): - pass - - def __set_name__(self, owner, name): - self.name = name - - def __get__(self, instance, owner): - return _JSIIClassMethod(owner, self.name) - - -if typing.TYPE_CHECKING: - # TODO: Figure out if this type checks correctly, if not how do we make it type - # check correctly... or is it even possible at all? - jsii_classproperty = property -else: - - class jsii_classproperty: - def __init__(self, meth): - pass - - def __set_name__(self, owner, name): - self.name = name - - def __get__(self, instance, owner): - return instance.__jsii_kernel__.sget(instance, self.name) - - def __set__(self, instance, value): - instance.__jsii_kernel__.sset(instance, self.name, value) From 86b92fba20e410fa749f903776a41feb4029d746 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 19:15:04 -0400 Subject: [PATCH 049/117] Enable Typechecking installed JSII packages --- packages/jsii-pacmak/lib/targets/python.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 2245940cd3..fd08b3d9b2 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -775,6 +775,7 @@ class PythonGenerator extends Generator { const packageName = toPythonPackageName(assm.name); const topLevelModuleName = toPythonModuleName(packageName); const moduleNames = this.modules.map(m => m.name); + const pyTypedFilename = path.join("src", toPythonModuleFilename(topLevelModuleName), "py.typed"); moduleNames.push(`${topLevelModuleName}._jsii`); moduleNames.sort(); @@ -795,7 +796,7 @@ class PythonGenerator extends Generator { this.code.line(`url="${assm.homepage}",`); this.code.line('package_dir={"": "src"},'); this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`); - this.code.line(`package_data={"${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); + this.code.line(`package_data={"${topLevelModuleName}": ["py.typed"], "${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); this.code.line('python_requires=">=3.6",'); this.code.unindent(")"); this.code.closeFile("setup.py"); @@ -813,6 +814,11 @@ class PythonGenerator extends Generator { this.code.openFile("MANIFEST.in"); this.code.line("include pyproject.toml"); this.code.closeFile("MANIFEST.in"); + + // We also need to write out a py.typed file, to Signal to MyPy that these files + // are safe to use for typechecking. + this.code.openFile(pyTypedFilename); + this.code.closeFile(pyTypedFilename); } protected onBeginNamespace(ns: string) { From 98875baebe7f9606147af6609521b8c79827e6d8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 19:39:50 -0400 Subject: [PATCH 050/117] Implement Python name mangling --- packages/jsii-pacmak/lib/targets/python.ts | 46 +++++++++++++++------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index fd08b3d9b2..f4f846bbf7 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -78,6 +78,14 @@ const toPythonIdentifier = (name: string): string => { return name; }; +const toPythonMethodName = (name: string): string => { + return toPythonIdentifier(toSnakeCase(name)); +}; + +const toPythonPropertyName = (name: string): string => { + return toPythonIdentifier(toSnakeCase(name)); +}; + const toPythonType = (typeref: spec.TypeReference): string => { if (spec.isPrimitiveTypeReference(typeref)) { return toPythonPrimitive(typeref.primitive); @@ -246,12 +254,14 @@ class BaseMethod implements PythonNode { protected readonly decorator?: string; protected readonly implicitParameter: string; + protected readonly jsName: string; protected readonly parameters: spec.Parameter[]; protected readonly returns?: spec.TypeReference; - constructor(moduleName: string, name: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { + constructor(moduleName: string, name: string, jsName: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { this.moduleName = moduleName; this.name = name; + this.jsName = jsName; this.parameters = parameters; this.returns = returns; } @@ -311,12 +321,14 @@ class BaseProperty implements PythonNode { protected readonly decorator: string; protected readonly implicitParameter: string; + protected readonly jsName: string; private readonly type: spec.TypeReference; private readonly immutable: boolean; - constructor(moduleName: string, name: string, type: spec.TypeReference, immutable: boolean) { + constructor(moduleName: string, name: string, jsName: string, type: spec.TypeReference, immutable: boolean) { this.moduleName = moduleName; this.name = name; + this.jsName = jsName; this.type = type; this.immutable = immutable; } @@ -430,7 +442,7 @@ class StaticMethod extends BaseMethod { paramNames.push(toPythonIdentifier(param.name)); } - code.line(`return jsii.sinvoke(${this.implicitParameter}, "${this.name}", [${paramNames.join(", ")}])`); + code.line(`return jsii.sinvoke(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); } } @@ -443,7 +455,7 @@ class Method extends BaseMethod { paramNames.push(toPythonIdentifier(param.name)); } - code.line(`return jsii.invoke(${this.implicitParameter}, "${this.name}", [${paramNames.join(", ")}])`); + code.line(`return jsii.invoke(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); } } @@ -452,11 +464,11 @@ class StaticProperty extends BaseProperty { protected readonly implicitParameter: string = "cls"; protected emitGetterBody(code: CodeMaker) { - code.line(`return jsii.sget(${this.implicitParameter}, "${this.name}")`); + code.line(`return jsii.sget(${this.implicitParameter}, "${this.jsName}")`); } protected emitSetterBody(code: CodeMaker) { - code.line(`return jsii.sset(${this.implicitParameter}, "${this.name}", value)`); + code.line(`return jsii.sset(${this.implicitParameter}, "${this.jsName}", value)`); } } @@ -465,11 +477,11 @@ class Property extends BaseProperty { protected readonly implicitParameter: string = "self"; protected emitGetterBody(code: CodeMaker) { - code.line(`return jsii.get(${this.implicitParameter}, "${this.name}")`); + code.line(`return jsii.get(${this.implicitParameter}, "${this.jsName}")`); } protected emitSetterBody(code: CodeMaker) { - code.line(`return jsii.set(${this.implicitParameter}, "${this.name}", value)`); + code.line(`return jsii.set(${this.implicitParameter}, "${this.jsName}", value)`); } } @@ -868,7 +880,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new StaticMethod( this.currentModule().name, - toPythonIdentifier(method.name!), + toPythonMethodName(method.name!), + method.name!, method.parameters || [], method.returns ) @@ -879,7 +892,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new Method( this.currentModule().name, - toPythonIdentifier(method.name!), + toPythonMethodName(method.name!), + method.name!, method.parameters || [], method.returns ) @@ -890,7 +904,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new StaticProperty( this.currentModule().name, - toPythonIdentifier(prop.name!), + toPythonPropertyName(prop.name!), + prop.name!, prop.type, prop.immutable || false ) @@ -901,7 +916,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new Property( this.currentModule().name, - toPythonIdentifier(prop.name!), + toPythonPropertyName(prop.name!), + prop.name!, prop.type, prop.immutable || false, ) @@ -928,7 +944,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new InterfaceMethod( this.currentModule().name, - toPythonIdentifier(method.name!), + toPythonMethodName(method.name!), + method.name!, method.parameters || [], method.returns ) @@ -939,7 +956,8 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new InterfaceProperty( this.currentModule().name, - toPythonIdentifier(prop.name!), + toPythonPropertyName(prop.name!), + prop.name!, prop.type, true, ) From dd3e31d796e2b3a521c658885dfe5532ba5f7a14 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 19:50:13 -0400 Subject: [PATCH 051/117] Refactor to remove duplication --- packages/jsii-pacmak/lib/targets/python.ts | 72 ++++++++++------------ 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index f4f846bbf7..c914d4b7ca 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -253,6 +253,7 @@ class BaseMethod implements PythonNode { protected readonly decorator?: string; protected readonly implicitParameter: string; + protected readonly jsiiMethod?: string; protected readonly jsName: string; protected readonly parameters: spec.Parameter[]; @@ -304,8 +305,17 @@ class BaseMethod implements PythonNode { code.closeBlock(); } - protected emitBody(code: CodeMaker) { - code.line("..."); + private emitBody(code: CodeMaker) { + if (this.jsiiMethod === undefined) { + code.line("..."); + } else { + const paramNames: string[] = []; + for (const param of this.parameters) { + paramNames.push(toPythonIdentifier(param.name)); + } + + code.line(`return jsii.${this.jsiiMethod}(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); + } } private getReturnType(type?: spec.TypeReference): string { @@ -320,6 +330,8 @@ class BaseProperty implements PythonNode { protected readonly decorator: string; protected readonly implicitParameter: string; + protected readonly jsiiGetMethod?: string; + protected readonly jsiiSetMethod?: string; protected readonly jsName: string; private readonly type: spec.TypeReference; @@ -357,12 +369,20 @@ class BaseProperty implements PythonNode { } } - protected emitGetterBody(code: CodeMaker) { - code.line("..."); + private emitGetterBody(code: CodeMaker) { + if (this.jsiiGetMethod === undefined) { + code.line("..."); + } else { + code.line(`return jsii.${this.jsiiGetMethod}(${this.implicitParameter}, "${this.jsName}")`); + } } - protected emitSetterBody(code: CodeMaker) { - code.line("..."); + private emitSetterBody(code: CodeMaker) { + if (this.jsiiSetMethod === undefined) { + code.line("..."); + } else { + code.line(`return jsii.${this.jsiiSetMethod}(${this.implicitParameter}, "${this.jsName}", value)`); + } } } @@ -435,54 +455,26 @@ class Interface implements PythonCollectionNode { class StaticMethod extends BaseMethod { protected readonly decorator?: string = "classmethod"; protected readonly implicitParameter: string = "cls"; - - protected emitBody(code: CodeMaker) { - const paramNames: string[] = []; - for (const param of this.parameters) { - paramNames.push(toPythonIdentifier(param.name)); - } - - code.line(`return jsii.sinvoke(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); - } + protected readonly jsiiMethod: string = "sinvoke"; } class Method extends BaseMethod { protected readonly implicitParameter: string = "self"; - - protected emitBody(code: CodeMaker) { - const paramNames: string[] = []; - for (const param of this.parameters) { - paramNames.push(toPythonIdentifier(param.name)); - } - - code.line(`return jsii.invoke(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); - } + protected readonly jsiiMethod: string = "invoke"; } class StaticProperty extends BaseProperty { protected readonly decorator: string = "classproperty"; protected readonly implicitParameter: string = "cls"; - - protected emitGetterBody(code: CodeMaker) { - code.line(`return jsii.sget(${this.implicitParameter}, "${this.jsName}")`); - } - - protected emitSetterBody(code: CodeMaker) { - code.line(`return jsii.sset(${this.implicitParameter}, "${this.jsName}", value)`); - } + protected readonly jsiiGetMethod: string = "sget"; + protected readonly jsiiSetMethod: string = "sset"; } class Property extends BaseProperty { protected readonly decorator: string = "property"; protected readonly implicitParameter: string = "self"; - - protected emitGetterBody(code: CodeMaker) { - code.line(`return jsii.get(${this.implicitParameter}, "${this.jsName}")`); - } - - protected emitSetterBody(code: CodeMaker) { - code.line(`return jsii.set(${this.implicitParameter}, "${this.jsName}", value)`); - } + protected readonly jsiiGetMethod: string = "get"; + protected readonly jsiiSetMethod: string = "set"; } class Class implements PythonCollectionNode { From 4e9fc0851b258764fa55510491176bfc70d21802 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 20:10:34 -0400 Subject: [PATCH 052/117] Always use the global kernel instead of the __jsii_kernel__ indrection --- packages/jsii-python-runtime/src/jsii/_runtime.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 2c51cd2939..8c39d5a530 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -45,15 +45,6 @@ def load(cls, *args, _kernel=kernel, **kwargs): class JSIIMeta(_ClassPropertyMeta, type): def __new__(cls, name, bases, attrs, *, jsii_type): - # TODO: We need to figure out exactly what we're going to do this the kernel - # here. Right now we're "creating" a new one per type, and relying on - # the fact it's a singleton so that everything is in the same kernel. - # That might not make complete sense though, particularly if we ever - # want to have multiple kernels in a single process (does that even - # make sense?). Perhaps we should pass it in like we pass the type, and - # have the autogenerated code either create it once per library or once - # per process. - attrs["__jsii_kernel__"] = kernel attrs["__jsii_type__"] = jsii_type obj = super().__new__(name, bases, attrs) @@ -66,7 +57,7 @@ def __call__(cls, *args, **kwargs): # Create our object at the JS level. # TODO: Handle args/kwargs # TODO: Handle Overrides - ref = cls.__jsii_kernel__.create(cls, args=args) + ref = kernel.create(cls, args=args) # Create our object at the Python level. obj = cls.__class__.from_reference(cls, ref, **kwargs) @@ -76,7 +67,7 @@ def __call__(cls, *args, **kwargs): # TODO: Figure out if this is *really* true, what happens if something goes # out of scope at the Python level, but something is holding onto it # at the JS level? What mechanics are in place for this if any? - weakref.finalize(obj, cls.__jsii_kernel__.delete, obj.__jsii_ref__) + weakref.finalize(obj, kernel.delete, obj.__jsii_ref__) # Instatiate our object at the Python level. if isinstance(obj, cls): From f1c6986aadaa2caa3473a3fc6ed2f91f38534263 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 20:12:11 -0400 Subject: [PATCH 053/117] Enable subclassing of JSII Classes --- packages/jsii-python-runtime/src/jsii/_runtime.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 8c39d5a530..3abb43f5c9 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -44,8 +44,13 @@ def load(cls, *args, _kernel=kernel, **kwargs): class JSIIMeta(_ClassPropertyMeta, type): - def __new__(cls, name, bases, attrs, *, jsii_type): - attrs["__jsii_type__"] = jsii_type + def __new__(cls, name, bases, attrs, *, jsii_type=None): + # We want to ensure that subclasses of a JSII class do not require setting the + # jsii_type keyword argument. They should be able to subclass it as normal. + # Since their parent class will have the __jsii_type__ variable defined, they + # will as well anyways. + if jsii_type is not None: + attrs["__jsii_type__"] = jsii_type obj = super().__new__(name, bases, attrs) From 721f677b7b780b75e3382a504ae1a7806334c581 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 20:13:13 -0400 Subject: [PATCH 054/117] Correct the call to the super class --- packages/jsii-python-runtime/src/jsii/_runtime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 3abb43f5c9..5dfaeeb9a6 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -52,7 +52,7 @@ def __new__(cls, name, bases, attrs, *, jsii_type=None): if jsii_type is not None: attrs["__jsii_type__"] = jsii_type - obj = super().__new__(name, bases, attrs) + obj = super().__new__(cls, name, bases, attrs) _reference_map.register_type(obj.__jsii_type__, obj) From 9e038519a85c1f7a9e03c0cb7d935c2dd15ab4cc Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 22:19:32 -0400 Subject: [PATCH 055/117] Use real __init__ methods to enable sublcassing of JSII classes --- packages/jsii-pacmak/lib/targets/python.ts | 51 +++++++++++++++++-- .../src/jsii/_kernel/__init__.py | 10 +++- .../src/jsii/_reference_map.py | 20 +++++--- .../jsii-python-runtime/src/jsii/_runtime.py | 31 ++++------- 4 files changed, 79 insertions(+), 33 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index c914d4b7ca..cce8f708f6 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -213,7 +213,7 @@ const sortMembers = (sortable: PythonCollectionNode[]): PythonCollectionNode[] = } return sorted; - }; +}; interface PythonNode { @@ -249,18 +249,27 @@ interface PythonCollectionNode extends PythonNode { class BaseMethod implements PythonNode { public readonly moduleName: string; + public readonly parent: PythonCollectionNode; public readonly name: string; protected readonly decorator?: string; protected readonly implicitParameter: string; protected readonly jsiiMethod?: string; + protected readonly classAsFirstParameter: boolean = false; + protected readonly returnFromJSIIMethod: boolean = true; - protected readonly jsName: string; + protected readonly jsName?: string; protected readonly parameters: spec.Parameter[]; protected readonly returns?: spec.TypeReference; - constructor(moduleName: string, name: string, jsName: string, parameters: spec.Parameter[], returns?: spec.TypeReference) { + constructor(moduleName: string, + parent: PythonCollectionNode, + name: string, + jsName: string | undefined, + parameters: spec.Parameter[], + returns?: spec.TypeReference) { this.moduleName = moduleName; + this.parent = parent; this.name = name; this.jsName = jsName; this.parameters = parameters; @@ -309,12 +318,23 @@ class BaseMethod implements PythonNode { if (this.jsiiMethod === undefined) { code.line("..."); } else { + const methodPrefix: string = this.returnFromJSIIMethod ? "return " : ""; + + const jsiiMethodParams: string[] = []; + if (this.classAsFirstParameter) { + jsiiMethodParams.push(this.parent.name); + } + jsiiMethodParams.push(this.implicitParameter); + if (this.jsName !== undefined) { + jsiiMethodParams.push(`"${this.jsName}"`); + } + const paramNames: string[] = []; for (const param of this.parameters) { paramNames.push(toPythonIdentifier(param.name)); } - code.line(`return jsii.${this.jsiiMethod}(${this.implicitParameter}, "${this.jsName}", [${paramNames.join(", ")}])`); + code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); } } @@ -458,6 +478,13 @@ class StaticMethod extends BaseMethod { protected readonly jsiiMethod: string = "sinvoke"; } +class Initializer extends BaseMethod { + protected readonly implicitParameter: string = "self"; + protected readonly jsiiMethod: string = "create"; + protected readonly classAsFirstParameter: boolean = true; + protected readonly returnFromJSIIMethod: boolean = false; +} + class Method extends BaseMethod { protected readonly implicitParameter: string = "self"; protected readonly jsiiMethod: string = "invoke"; @@ -862,6 +889,19 @@ class PythonGenerator extends Generator { cls.fqn ) ); + + if (cls.initializer !== undefined) { + this.currentMember.addMember( + new Initializer( + currentModule.name, + this.currentMember, + "__init__", + undefined, + cls.initializer.parameters || [], + cls.initializer.returns + ) + ); + } } protected onEndClass(_cls: spec.ClassType) { @@ -872,6 +912,7 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new StaticMethod( this.currentModule().name, + this.currentMember!, toPythonMethodName(method.name!), method.name!, method.parameters || [], @@ -884,6 +925,7 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new Method( this.currentModule().name, + this.currentMember!, toPythonMethodName(method.name!), method.name!, method.parameters || [], @@ -936,6 +978,7 @@ class PythonGenerator extends Generator { this.currentMember!.addMember( new InterfaceMethod( this.currentModule().name, + this.currentMember!, toPythonMethodName(method.name!), method.name!, method.parameters || [], diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 9ba82e3504..28e1b30b52 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -67,11 +67,17 @@ def __init__(self, provider_class: Type[BaseKernel] = ProcessKernel) -> None: def load(self, name: str, version: str, tarball: str) -> None: self.provider.load(LoadRequest(name=name, version=version, tarball=tarball)) - def create(self, klass: JSClass, args: Optional[List[Any]] = None) -> ObjRef: + # TODO: Is there a way to say that obj has to be an instance of klass? + def create( + self, klass: JSClass, obj: Any, args: Optional[List[Any]] = None + ) -> ObjRef: if args is None: args = [] - return self.provider.create(CreateRequest(fqn=klass.__jsii_type__, args=args)) + # TODO: Handle Overrides + obj.__jsii_ref__ = self.provider.create( + CreateRequest(fqn=klass.__jsii_type__, args=args) + ) def delete(self, ref: ObjRef) -> None: self.provider.delete(DeleteRequest(objref=ref)) diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index 47bfdd49f5..baed667da7 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -1,12 +1,14 @@ # This module exists to break an import cycle between jsii.runtime and jsii.kernel import weakref +from ._kernel.types import JSClass, Referenceable + _types = {} -def register_type(type_, obj): - _types[type_] = obj +def register_type(klass: JSClass): + _types[klass.__jsii_type__] = klass class _ReferenceMap: @@ -14,8 +16,8 @@ def __init__(self, types): self._refs = weakref.WeakValueDictionary() self._types = types - def register(self, ref, inst): - self._refs[ref] = inst + def register(self, inst: Referenceable): + self._refs[inst.__jsii_ref__.ref] = inst def resolve(self, ref): # First we need to check our reference map to see if we have any instance that @@ -28,8 +30,14 @@ def resolve(self, ref): # If we got to this point, then we didn't have a referene for this, in that case # we want to create a new instance, but we need to create it in such a way that # we don't try to recreate the type inside of the JSII interface. - class_ = _types[ref.ref.rsplit("@", 1)[0]] - return class_.__class__.from_reference(class_, ref) + klass = _types[ref.ref.rsplit("@", 1)[0]] + + # Create our instance, bypassing __init__ by directly calling __new__, and then + # assign our reference to __jsii_ref__ + inst = klass.__new__(klass) + inst.__jsii_ref__ = ref + + return inst _refs = _ReferenceMap(_types) diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 5dfaeeb9a6..aa044144e2 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -54,36 +54,25 @@ def __new__(cls, name, bases, attrs, *, jsii_type=None): obj = super().__new__(cls, name, bases, attrs) - _reference_map.register_type(obj.__jsii_type__, obj) + # Now that we've created the class, we'll need to register it with our reference + # mapper. We only do this for types that are actually jsii types, and not any + # subclasses of them. + if jsii_type is not None: + _reference_map.register_type(obj) return obj def __call__(cls, *args, **kwargs): - # Create our object at the JS level. - # TODO: Handle args/kwargs - # TODO: Handle Overrides - ref = kernel.create(cls, args=args) + inst = super().__call__(*args, **kwargs) - # Create our object at the Python level. - obj = cls.__class__.from_reference(cls, ref, **kwargs) + # Register this instance with our reference map. + _reference_map.register_reference(inst) # Whenever the object we're creating gets garbage collected, then we want to # delete it from the JS runtime as well. # TODO: Figure out if this is *really* true, what happens if something goes # out of scope at the Python level, but something is holding onto it # at the JS level? What mechanics are in place for this if any? - weakref.finalize(obj, kernel.delete, obj.__jsii_ref__) - - # Instatiate our object at the Python level. - if isinstance(obj, cls): - obj.__init__(**kwargs) - - return obj + weakref.finalize(inst, kernel.delete, inst.__jsii_ref__) - def from_reference(cls, ref, *args, **kwargs): - obj = cls.__new__(cls, *args, **kwargs) - obj.__jsii_ref__ = ref - - _reference_map.register_reference(obj.__jsii_ref__.ref, obj) - - return obj + return inst From 79b4d4d63320d48b27d8bb1ae94355f526866b56 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sat, 20 Oct 2018 22:57:03 -0400 Subject: [PATCH 056/117] Make sure that classes inherent from their bases and interfaces --- packages/jsii-pacmak/lib/targets/python.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index cce8f708f6..78fb5714ee 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -509,13 +509,15 @@ class Class implements PythonCollectionNode { public readonly name: string; private jsiiFQN: string; + private bases: string[]; private members: PythonNode[]; - constructor(moduleName: string, name: string, jsiiFQN: string) { + constructor(moduleName: string, name: string, jsiiFQN: string, bases: string[]) { this.moduleName = moduleName; this.name = name; this.jsiiFQN = jsiiFQN; + this.bases = bases; this.members = []; } @@ -524,7 +526,7 @@ class Class implements PythonCollectionNode { } get depends_on(): string[] { - return []; + return this.bases.filter(base => base.startsWith(this.moduleName + ".")); } public addMember(member: PythonNode): PythonNode { @@ -544,9 +546,13 @@ class Class implements PythonCollectionNode { public emit(code: CodeMaker) { // TODO: Data Types? - // TODO: Bases - code.openBlock(`class ${this.name}(metaclass=jsii.JSIIMeta, jsii_type="${this.jsiiFQN}")`); + let basesString: string = ""; + if (this.bases.length >= 1) { + basesString = this.bases.join(", ") + ", "; + } + + code.openBlock(`class ${this.name}(${basesString}metaclass=jsii.JSIIMeta, jsii_type="${this.jsiiFQN}")`); if (this.members.length > 0) { for (const member of this.members) { member.emit(code); @@ -886,7 +892,8 @@ class PythonGenerator extends Generator { new Class( currentModule.name, toPythonIdentifier(cls.name), - cls.fqn + cls.fqn, + ((cls.base !== undefined ? [cls.base] : []).concat(cls.interfaces || [])).map(b => toPythonType(b)), ) ); From 67058b9dfb525db32465fbd108247ab0f13cc4b0 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 00:52:55 -0400 Subject: [PATCH 057/117] Correctly limit dependencies to this module, even when faced with submodules --- packages/jsii-pacmak/lib/targets/python.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 78fb5714ee..5793dc91a4 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -2,6 +2,7 @@ import path = require('path'); import util = require('util'); import { CodeMaker, toSnakeCase } from 'codemaker'; +import * as escapeStringRegexp from 'escape-string-regexp'; import * as spec from 'jsii-spec'; import { Generator, GeneratorOptions } from '../generator'; import { Target, TargetOptions } from '../target'; @@ -215,6 +216,10 @@ const sortMembers = (sortable: PythonCollectionNode[]): PythonCollectionNode[] = return sorted; }; +const isInModule = (modName: string, fqn: string): boolean => { + return new RegExp(`^${escapeStringRegexp(modName)}\.[^\.]+$`).test(fqn); +}; + interface PythonNode { // The name of the module that this Node exists in. @@ -436,7 +441,7 @@ class Interface implements PythonCollectionNode { } get depends_on(): string[] { - return this.bases.filter(base => base.startsWith(this.moduleName + ".")); + return this.bases.filter(base => isInModule(this.moduleName, base)); } public addMember(member: PythonNode): PythonNode { @@ -526,7 +531,7 @@ class Class implements PythonCollectionNode { } get depends_on(): string[] { - return this.bases.filter(base => base.startsWith(this.moduleName + ".")); + return this.bases.filter(base => isInModule(this.moduleName, base)); } public addMember(member: PythonNode): PythonNode { From f5f0ec5f0f3b52b1f571849b0b1571f23f59a676 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 01:33:06 -0400 Subject: [PATCH 058/117] Implement Dataclasses as TypedDicts --- packages/jsii-pacmak/lib/targets/python.ts | 139 +++++++++++++++--- packages/jsii-python-runtime/setup.py | 1 + .../jsii-python-runtime/src/jsii/compat.py | 3 +- 3 files changed, 121 insertions(+), 22 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 5793dc91a4..b4031aae6a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -460,8 +460,6 @@ class Interface implements PythonCollectionNode { } public emit(code: CodeMaker) { - // TODO: Data Types? - const interfaceBases = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); interfaceBases.push("_Protocol"); @@ -477,6 +475,82 @@ class Interface implements PythonCollectionNode { } } +class TypedDictProperty implements PythonNode { + + public readonly moduleName: string; + public readonly name: string; + + private readonly type: spec.TypeReference; + + constructor(moduleName: string, name: string, type: spec.TypeReference) { + this.moduleName = moduleName; + this.name = name; + this.type = type; + } + + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + + public requiredTypes(): string[] { + return [toPythonType(this.type)]; + } + + public emit(code: CodeMaker) { + const propType: string = formatPythonType(toPythonType(this.type), undefined, this.moduleName); + code.line(`${this.name}: ${propType}`); + } +} + +class TypedDict implements PythonCollectionNode { + public readonly moduleName: string; + public readonly name: string; + + private members: PythonNode[]; + + constructor(moduleName: string, name: string) { + this.moduleName = moduleName; + this.name = name; + + this.members = []; + } + + get fqn(): string { + return `${this.moduleName}.${this.name}`; + } + + get depends_on(): string[] { + return []; + } + + public addMember(member: TypedDictProperty): TypedDictProperty { + this.members.push(member); + return member; + } + + public requiredTypes(): string[] { + const types: string[] = []; + + for (const member of this.members) { + types.push(...member.requiredTypes()); + } + + return types; + } + + public emit(code: CodeMaker) { + code.openBlock(`class ${this.name}(_TypedDict, total=False)`); + if (this.members.length > 0) { + for (const member of this.members) { + member.emit(code); + } + } else { + code.line("pass"); + } + code.closeBlock(); + } +} + class StaticMethod extends BaseMethod { protected readonly decorator?: string = "classmethod"; protected readonly implicitParameter: string = "cls"; @@ -664,7 +738,7 @@ class Module { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. code.line("import jsii"); - code.line(this.generateImportFrom("jsii.compat", ["Protocol"])); + code.line(this.generateImportFrom("jsii.compat", ["Protocol", "TypedDict"])); code.line("from jsii.python import classproperty"); // Go over all of the modules that we need to import, and import them. @@ -973,20 +1047,33 @@ class PythonGenerator extends Generator { protected onBeginInterface(ifc: spec.InterfaceType) { const currentModule = this.currentModule(); - this.currentMember = currentModule.addMember( - new Interface( - currentModule.name, - toPythonIdentifier(ifc.name), - (ifc.interfaces || []).map(i => toPythonType(i)) - ) - ); + if (ifc.datatype) { + this.currentMember = currentModule.addMember( + new TypedDict( + currentModule.name, + toPythonIdentifier(ifc.name) + ) + ); + } else { + this.currentMember = currentModule.addMember( + new Interface( + currentModule.name, + toPythonIdentifier(ifc.name), + (ifc.interfaces || []).map(i => toPythonType(i)) + ) + ); + } } protected onEndInterface(_ifc: spec.InterfaceType) { this.currentMember = undefined; } - protected onInterfaceMethod(_ifc: spec.InterfaceType, method: spec.Method) { + protected onInterfaceMethod(ifc: spec.InterfaceType, method: spec.Method) { + if (ifc.datatype) { + throw new Error("Cannot have a method on a data type."); + } + this.currentMember!.addMember( new InterfaceMethod( this.currentModule().name, @@ -999,16 +1086,26 @@ class PythonGenerator extends Generator { ); } - protected onInterfaceProperty(_ifc: spec.InterfaceType, prop: spec.Property) { - this.currentMember!.addMember( - new InterfaceProperty( - this.currentModule().name, - toPythonPropertyName(prop.name!), - prop.name!, - prop.type, - true, - ) - ); + protected onInterfaceProperty(ifc: spec.InterfaceType, prop: spec.Property) { + if (ifc.datatype) { + this.currentMember!.addMember( + new TypedDictProperty( + this.currentModule().name, + toPythonIdentifier(prop.name!), + prop.type, + ) + ); + } else { + this.currentMember!.addMember( + new InterfaceProperty( + this.currentModule().name, + toPythonPropertyName(prop.name!), + prop.name!, + prop.type, + true, + ) + ); + } } protected onBeginEnum(enm: spec.EnumType) { diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py index 03c115f664..86440270d2 100644 --- a/packages/jsii-python-runtime/setup.py +++ b/packages/jsii-python-runtime/setup.py @@ -20,6 +20,7 @@ "cattrs", "importlib_resources ; python_version < '3.7'", "typing_extensions>=3.6.4", + "mypy_extensions>=0.4.0", ], python_requires=">=3.6", ) diff --git a/packages/jsii-python-runtime/src/jsii/compat.py b/packages/jsii-python-runtime/src/jsii/compat.py index 1c1e037c51..ea8b6c8d87 100644 --- a/packages/jsii-python-runtime/src/jsii/compat.py +++ b/packages/jsii-python-runtime/src/jsii/compat.py @@ -1,6 +1,7 @@ # External Compatability Shims +from mypy_extensions import TypedDict from typing_extensions import Protocol -__all__ = ["Protocol"] +__all__ = ["Protocol", "TypedDict"] From a2d6c50d7a6fb8f4588f96341dce686bfd3adb81 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 02:50:40 -0400 Subject: [PATCH 059/117] Support typing the JSII package --- packages/jsii-python-runtime/setup.py | 2 +- packages/jsii-python-runtime/src/jsii/py.typed | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/jsii-python-runtime/src/jsii/py.typed diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py index 86440270d2..d3d7396128 100644 --- a/packages/jsii-python-runtime/setup.py +++ b/packages/jsii-python-runtime/setup.py @@ -12,7 +12,7 @@ package_dir={"": "src"}, packages=setuptools.find_packages(where="src"), package_data={ - "jsii": ["_metadata.json"], + "jsii": ["_metadata.json", "py.typed"], "jsii._embedded.jsii": ["*.js", "*.js.map", "*.wasm"], }, install_requires=[ diff --git a/packages/jsii-python-runtime/src/jsii/py.typed b/packages/jsii-python-runtime/src/jsii/py.typed new file mode 100644 index 0000000000..e69de29bb2 From 99278c9b084bceec652df6eb8653478216bf53cc Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 03:23:14 -0400 Subject: [PATCH 060/117] Better handle numbers --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- packages/jsii-python-runtime/src/jsii/__init__.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index b4031aae6a..a47d204906 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -120,7 +120,7 @@ const toPythonPrimitive = (primitive: spec.PrimitiveType): string => { case spec.PrimitiveType.Boolean: return "bool"; case spec.PrimitiveType.Date: return "datetime.datetime"; case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; - case spec.PrimitiveType.Number: return "numbers.Number"; + case spec.PrimitiveType.Number: return "jsii.Number"; case spec.PrimitiveType.String: return "str"; case spec.PrimitiveType.Any: return "typing.Any"; default: diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 39e6dd8f21..db2c4a9a37 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,6 +1,13 @@ +from typing import Union + from ._runtime import JSIIAssembly, JSIIMeta, kernel +# JS doesn't have distinct float or integer types, but we do. So we'll define our own +# type alias that will allow either. +Number = Union[int, float] + + # Alias our Kernel methods here, so that jsii. works. This will hide the fact # that there is a kernel at all from our callers. load = kernel.load @@ -18,6 +25,7 @@ __all__ = [ "JSIIAssembly", "JSIIMeta", + "Number", "load", "create", "delete", From e75585cfc731044be3f154d0e0b9d0d3a99ff17b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 03:33:05 -0400 Subject: [PATCH 061/117] Correctly emit class bases --- packages/jsii-pacmak/lib/targets/python.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index a47d204906..ed17a71018 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -624,14 +624,12 @@ class Class implements PythonCollectionNode { } public emit(code: CodeMaker) { - // TODO: Data Types? + const classParams: string[] = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); - let basesString: string = ""; - if (this.bases.length >= 1) { - basesString = this.bases.join(", ") + ", "; - } + classParams.push("metaclass=jsii.JSIIMeta"); + classParams.push(`jsii_type="${this.jsiiFQN}"`); - code.openBlock(`class ${this.name}(${basesString}metaclass=jsii.JSIIMeta, jsii_type="${this.jsiiFQN}")`); + code.openBlock(`class ${this.name}(${classParams.join(", ")})`); if (this.members.length > 0) { for (const member of this.members) { member.emit(code); From 530f6c715fd223b12be3b6e46f118688b56f2c46 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 03:37:20 -0400 Subject: [PATCH 062/117] Don't inhereit from Interfaces MyPy Protocols do not require inheritence to work, however we were using that as documentation for what interfaces a particular class implements. However, as it turns out, the Protocol class uses a metaclass, which conflicts with the JSIIMeta in use by our JSII classes. So we'll have to rely on the duck typing support of MyPy instead. --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index ed17a71018..442dbbe464 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -970,7 +970,7 @@ class PythonGenerator extends Generator { currentModule.name, toPythonIdentifier(cls.name), cls.fqn, - ((cls.base !== undefined ? [cls.base] : []).concat(cls.interfaces || [])).map(b => toPythonType(b)), + (cls.base !== undefined ? [cls.base] : []).map(b => toPythonType(b)), ) ); From e9b025042135ce76cc9d0470bc6d283e28f93eb9 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 14:56:41 -0400 Subject: [PATCH 063/117] These can be private --- packages/jsii-pacmak/lib/targets/python.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 442dbbe464..cd80e170a9 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -263,9 +263,9 @@ class BaseMethod implements PythonNode { protected readonly classAsFirstParameter: boolean = false; protected readonly returnFromJSIIMethod: boolean = true; - protected readonly jsName?: string; - protected readonly parameters: spec.Parameter[]; - protected readonly returns?: spec.TypeReference; + private readonly jsName?: string; + private readonly parameters: spec.Parameter[]; + private readonly returns?: spec.TypeReference; constructor(moduleName: string, parent: PythonCollectionNode, From 7edc04eb8320c54b2f0f0ba6ce385a6f238a9b5c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 16:17:16 -0400 Subject: [PATCH 064/117] Handle lifting a data type into keyword arguments --- packages/jsii-pacmak/lib/targets/python.ts | 124 +++++++++++++++++---- 1 file changed, 101 insertions(+), 23 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index cd80e170a9..96bed91a38 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -88,21 +88,31 @@ const toPythonPropertyName = (name: string): string => { }; const toPythonType = (typeref: spec.TypeReference): string => { + let pythonType: string; + + // Get the underlying python type. if (spec.isPrimitiveTypeReference(typeref)) { - return toPythonPrimitive(typeref.primitive); + pythonType = toPythonPrimitive(typeref.primitive); } else if (spec.isCollectionTypeReference(typeref)) { - return toPythonCollection(typeref); + pythonType = toPythonCollection(typeref); } else if (spec.isNamedTypeReference(typeref)) { - return toPythonFQN(typeref.fqn); + pythonType = toPythonFQN(typeref.fqn); } else if (typeref.union) { const types = new Array(); for (const subtype of typeref.union.types) { types.push(toPythonType(subtype)); } - return `typing.Union[${types.join(", ")}]`; + pythonType = `typing.Union[${types.join(", ")}]`; } else { throw new Error("Invalid type reference: " + JSON.stringify(typeref)); } + + // If our type is Optional, then we'll wrap our underlying type with typing.Optional + if (typeref.optional) { + pythonType = `typing.Optional[${pythonType}]`; + } + + return pythonType; }; const toPythonCollection = (ref: spec.CollectionTypeReference) => { @@ -266,19 +276,22 @@ class BaseMethod implements PythonNode { private readonly jsName?: string; private readonly parameters: spec.Parameter[]; private readonly returns?: spec.TypeReference; + private readonly liftedProp?: spec.InterfaceType; constructor(moduleName: string, parent: PythonCollectionNode, name: string, jsName: string | undefined, parameters: spec.Parameter[], - returns?: spec.TypeReference) { + returns?: spec.TypeReference, + liftedProp?: spec.InterfaceType) { this.moduleName = moduleName; this.parent = parent; this.name = name; this.jsName = jsName; this.parameters = parameters; this.returns = returns; + this.liftedProp = liftedProp; } get fqn(): string { @@ -310,6 +323,29 @@ class BaseMethod implements PythonNode { pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); } + // If we have a lifted parameter, then we'll drop the last argument to our params + // and then we'll lift all of the params of the lifted type as keyword arguments + // to the function. + if (this.liftedProp !== undefined) { + // Remove our last item. + pythonParams.pop(); + + if (this.liftedProp.properties !== undefined && this.liftedProp.properties.length >= 1) { + // All of these parameters are keyword only arguments, so we'll mark them + // as such. + pythonParams.push("*"); + + // Iterate over all of our props, and reflect them into our params. + for (const prop of this.liftedProp.properties) { + const paramName = toPythonIdentifier(prop.name); + const paramType = toPythonType(prop.type); + const paramDefault = prop.type.optional ? "=None" : ""; + + pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}${paramDefault}`); + } + } + } + if (this.decorator !== undefined) { code.line(`@${this.decorator}`); } @@ -323,24 +359,45 @@ class BaseMethod implements PythonNode { if (this.jsiiMethod === undefined) { code.line("..."); } else { - const methodPrefix: string = this.returnFromJSIIMethod ? "return " : ""; - - const jsiiMethodParams: string[] = []; - if (this.classAsFirstParameter) { - jsiiMethodParams.push(this.parent.name); - } - jsiiMethodParams.push(this.implicitParameter); - if (this.jsName !== undefined) { - jsiiMethodParams.push(`"${this.jsName}"`); + if (this.liftedProp !== undefined) { + this.emitAutoProps(code); } - const paramNames: string[] = []; - for (const param of this.parameters) { - paramNames.push(toPythonIdentifier(param.name)); - } + this.emitJsiiMethodCall(code); + } + } + + private emitAutoProps(code: CodeMaker) { + const lastParameter = this.parameters.slice(-1)[0]; + const argName: string = toPythonIdentifier(lastParameter.name); + const typeName: string = formatPythonType(toPythonType(lastParameter.type), true, this.moduleName); + + const propMembers: string[] = []; + for (const prop of this.liftedProp!.properties || []) { + propMembers.push(`"${toPythonIdentifier(prop.name)}": ${toPythonIdentifier(prop.name)}`); + } + + code.line(`${argName}: ${typeName} = {${propMembers.join(", ")}}`); + } + + private emitJsiiMethodCall(code: CodeMaker) { + const methodPrefix: string = this.returnFromJSIIMethod ? "return " : ""; - code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); + const jsiiMethodParams: string[] = []; + if (this.classAsFirstParameter) { + jsiiMethodParams.push(this.parent.name); + } + jsiiMethodParams.push(this.implicitParameter); + if (this.jsName !== undefined) { + jsiiMethodParams.push(`"${this.jsName}"`); + } + + const paramNames: string[] = []; + for (const param of this.parameters) { + paramNames.push(toPythonIdentifier(param.name)); } + + code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); } private getReturnType(type?: spec.TypeReference): string { @@ -982,7 +1039,8 @@ class PythonGenerator extends Generator { "__init__", undefined, cls.initializer.parameters || [], - cls.initializer.returns + cls.initializer.returns, + this.getliftedProp(cls.initializer), ) ); } @@ -1000,7 +1058,8 @@ class PythonGenerator extends Generator { toPythonMethodName(method.name!), method.name!, method.parameters || [], - method.returns + method.returns, + this.getliftedProp(method), ) ); } @@ -1013,7 +1072,8 @@ class PythonGenerator extends Generator { toPythonMethodName(method.name!), method.name!, method.parameters || [], - method.returns + method.returns, + this.getliftedProp(method), ) ); } @@ -1079,7 +1139,8 @@ class PythonGenerator extends Generator { toPythonMethodName(method.name!), method.name!, method.parameters || [], - method.returns + method.returns, + this.getliftedProp(method), ) ); } @@ -1155,6 +1216,23 @@ class PythonGenerator extends Generator { // End Not Currently Used + private getliftedProp(method: spec.Method): spec.InterfaceType | undefined { + // If there are parameters to this method, and if the last parameter's type is + // a datatype interface, then we want to lift the members of that last paramter + // as keyword arguments to this function. + if (method.parameters !== undefined && method.parameters.length >= 1) { + const lastParameter = method.parameters.slice(-1)[0]; + if (spec.isNamedTypeReference(lastParameter.type)) { + const lastParameterType = this.findType(lastParameter.type.fqn); + if (spec.isInterfaceType(lastParameterType) && lastParameterType.datatype) { + return lastParameterType; + } + } + } + + return undefined; + } + private currentModule(): Module { return this.moduleStack.slice(-1)[0]; } From 771e9232015414cc31f91d6d0ca7d705155e3fd0 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 19:52:00 -0400 Subject: [PATCH 065/117] Handle Mandatory/Optional data type members --- packages/jsii-pacmak/lib/targets/python.ts | 86 +++++++++++++++++++--- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 96bed91a38..182c465c2c 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -87,7 +87,7 @@ const toPythonPropertyName = (name: string): string => { return toPythonIdentifier(toSnakeCase(name)); }; -const toPythonType = (typeref: spec.TypeReference): string => { +const toPythonType = (typeref: spec.TypeReference, respectOptional: boolean = true): string => { let pythonType: string; // Get the underlying python type. @@ -108,7 +108,8 @@ const toPythonType = (typeref: spec.TypeReference): string => { } // If our type is Optional, then we'll wrap our underlying type with typing.Optional - if (typeref.optional) { + // However, if we're not respecting optionals, then we'll just skip over this. + if (respectOptional && typeref.optional) { pythonType = `typing.Optional[${pythonType}]`; } @@ -372,12 +373,30 @@ class BaseMethod implements PythonNode { const argName: string = toPythonIdentifier(lastParameter.name); const typeName: string = formatPythonType(toPythonType(lastParameter.type), true, this.moduleName); - const propMembers: string[] = []; + // We need to build up a list of properties, which are mandatory, these are the + // ones we will specifiy to start with in our dictionary literal. + const mandatoryPropMembers: string[] = []; for (const prop of this.liftedProp!.properties || []) { - propMembers.push(`"${toPythonIdentifier(prop.name)}": ${toPythonIdentifier(prop.name)}`); + if (prop.type.optional) { + continue; + } + + mandatoryPropMembers.push(`"${toPythonIdentifier(prop.name)}": ${toPythonIdentifier(prop.name)}`); } + code.line(`${argName}: ${typeName} = {${mandatoryPropMembers.join(", ")}}`); + code.line(); - code.line(`${argName}: ${typeName} = {${propMembers.join(", ")}}`); + // Now we'll go through our optional properties, and if they haven't been set + // we'll add them to our dictionary. + for (const prop of this.liftedProp!.properties || []) { + if (!prop.type.optional) { + continue; + } + + code.openBlock(`if ${toPythonIdentifier(prop.name)} is not None`); + code.line(`${argName}["${toPythonIdentifier(prop.name)}"] = ${toPythonIdentifier(prop.name)}`); + code.closeBlock(); + } } private emitJsiiMethodCall(code: CodeMaker) { @@ -549,12 +568,16 @@ class TypedDictProperty implements PythonNode { return `${this.moduleName}.${this.name}`; } + get optional(): boolean { + return this.type.optional || false; + } + public requiredTypes(): string[] { return [toPythonType(this.type)]; } public emit(code: CodeMaker) { - const propType: string = formatPythonType(toPythonType(this.type), undefined, this.moduleName); + const propType: string = formatPythonType(toPythonType(this.type, false), undefined, this.moduleName); code.line(`${this.name}: ${propType}`); } } @@ -563,7 +586,7 @@ class TypedDict implements PythonCollectionNode { public readonly moduleName: string; public readonly name: string; - private members: PythonNode[]; + private members: TypedDictProperty[]; constructor(moduleName: string, name: string) { this.moduleName = moduleName; @@ -596,15 +619,54 @@ class TypedDict implements PythonCollectionNode { } public emit(code: CodeMaker) { - code.openBlock(`class ${this.name}(_TypedDict, total=False)`); - if (this.members.length > 0) { - for (const member of this.members) { + // MyPy doesn't let us mark some keys as optional, and some keys as mandatory, + // we can either mark either the entire class as mandatory or the entire class + // as optional. However, we can make two classes, one with all mandatory keys + // and one with all optional keys in order to emulate this. So we'll go ahead + // and implement this "split" class logic. + + const mandatoryMembers = this.members.filter(item => !item.optional); + const optionalMembers = this.members.filter(item => item.optional); + + if (mandatoryMembers.length >= 1 && optionalMembers.length >= 1) { + // In this case, we have both mandatory *and* optional members, so we'll + // do our split class logic. + + // We'll emit the optional members first, just because it's a little nicer + // for the final class in the chain to have the mandatory members. + code.openBlock(`class _${this.name}(_TypedDict, total=False)`); + for (const member of optionalMembers) { member.emit(code); } + code.closeBlock(); + + // Now we'll emit the mandatory members. + code.openBlock(`class ${this.name}(_${this.name})`); + for (const member of mandatoryMembers) { + member.emit(code); + } + code.closeBlock(); } else { - code.line("pass"); + // In this case we either have no members, or we have all of one type, so + // we'll see if we have any optional members, if we don't then we'll use + // total=True instead of total=False for the class. + if (optionalMembers.length >= 1) { + code.openBlock(`class ${this.name}(_TypedDict, total=False)`); + } else { + code.openBlock(`class ${this.name}(_TypedDict)`); + } + + // Finally we'll just iterate over and emit all of our members. + if (this.members.length > 0) { + for (const member of this.members) { + member.emit(code); + } + } else { + code.line("pass"); + } + + code.closeBlock(); } - code.closeBlock(); } } From 25def601478a0927f8d320f84169b65d991c8545 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 21 Oct 2018 20:02:08 -0400 Subject: [PATCH 066/117] Use publication to hide implementation details from end users --- packages/jsii-pacmak/lib/targets/python.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 182c465c2c..372afc2f46 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -855,6 +855,8 @@ class Module { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. code.line("import jsii"); + code.line("import publication"); + code.line(); code.line(this.generateImportFrom("jsii.compat", ["Protocol", "TypedDict"])); code.line("from jsii.python import classproperty"); @@ -885,8 +887,13 @@ class Module { member.emit(code); } - // // Whatever names we've exported, we'll write out our __all__ that lists them. + // Whatever names we've exported, we'll write out our __all__ that lists them. code.line(`__all__ = [${this.getExportedNames().map(s => `"${s}"`).join(", ")}]`); + + // Finally, we'll use publication to ensure that all of the non-public names + // get hidden from dir(), tab-complete, etc. + code.line(); + code.line("publication.publish()"); } private getRequiredTypeImports(): string[] { @@ -1031,6 +1038,7 @@ class PythonGenerator extends Generator { this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`); this.code.line(`package_data={"${topLevelModuleName}": ["py.typed"], "${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); this.code.line('python_requires=">=3.6",'); + this.code.line(`install_requires=["publication"],`); this.code.unindent(")"); this.code.closeFile("setup.py"); From a000fb7e15993c62512874c9eda57dbe112b6483 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 19 Oct 2018 17:13:47 -0400 Subject: [PATCH 067/117] Refactor module dependency to use Assembly metadata --- packages/jsii-pacmak/lib/targets/python.ts | 208 ++++++--------------- packages/jsii-pacmak/package.json | 2 + 2 files changed, 57 insertions(+), 153 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 372afc2f46..f73b4dbaf1 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -140,13 +140,13 @@ const toPythonPrimitive = (primitive: spec.PrimitiveType): string => { }; const toPythonFQN = (name: string): string => { - return name.split(".").map((cur, idx, arr) => { - if (idx === arr.length - 1) { - return toPythonIdentifier(cur); - } else { - return toPythonModuleName(cur); - } - }).join("."); + const [, modulePart, typePart] = name.match(/^((?:[^A-Z\.][^\.]+\.?)+)\.([A-Z].+)$/) as string[]; + const fqnParts = [ + toPythonModuleName(modulePart), + typePart.split(".").map(cur => toPythonIdentifier(cur)).join(".") + ]; + + return fqnParts.join("."); }; const formatPythonType = (type: string, forwardReference: boolean = false, moduleName: string) => { @@ -155,6 +155,7 @@ const formatPythonType = (type: string, forwardReference: boolean = false, modul // no matter how nested they are. The downside is we might get trailing/leading // spaces or empty items so we'll need to trim and filter this list. const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); + // const moduleRe = new RegExp(`^${escapeStringRegexp(moduleName)}\.([A-Z].+)$`); for (const innerType of types) { // Built in types do not need formatted in any particular way. @@ -164,16 +165,18 @@ const formatPythonType = (type: string, forwardReference: boolean = false, modul // If we do not have a current moduleName, or the type is not within that // module, then we don't format it any particular way. + // if (!moduleRe.test(innerType)) { if (!innerType.startsWith(moduleName + ".")) { continue; } else { const typeName = innerType.substring(moduleName.length + 1, innerType.length); + // const [, typeName] = innerType.match(moduleRe) as string[]; const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); // If this is our current module, then we need to correctly handle our // forward references, by placing the type inside of quotes, unless // we're returning real forward references. - if (!forwardReference) { + if (!forwardReference && !typeName.match(/^[a-z]/)) { type = type.replace(re, `$1"${innerType}"$2`); } @@ -242,11 +245,6 @@ interface PythonNode { // The fully qualifed name of this node. readonly fqn: string; - // Returns a list of all of the FQN Python types that this Node requires, this - // should traverse all of it's members to get the full list of all types required to - // exist (i.e. be imported). - requiredTypes(): string[]; - // Emits the entire tree of objects represented by this object into the given // CodeMaker object. emit(code: CodeMaker): void; @@ -299,16 +297,6 @@ class BaseMethod implements PythonNode { return `${this.moduleName}.${this.name}`; } - public requiredTypes(): string[] { - const types: string[] = [this.getReturnType(this.returns)]; - - for (const param of this.parameters) { - types.push(toPythonType(param.type)); - } - - return types; - } - public emit(code: CodeMaker) { const returnType = this.getReturnType(this.returns); @@ -450,10 +438,6 @@ class BaseProperty implements PythonNode { return `${this.moduleName}.${this.name}`; } - public requiredTypes(): string[] { - return [toPythonType(this.type)]; - } - public emit(code: CodeMaker) { const returnType = toPythonType(this.type); @@ -525,16 +509,6 @@ class Interface implements PythonCollectionNode { return member; } - public requiredTypes(): string[] { - const types = this.bases.slice(); - - for (const member of this.members) { - types.push(...member.requiredTypes()); - } - - return types; - } - public emit(code: CodeMaker) { const interfaceBases = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); interfaceBases.push("_Protocol"); @@ -572,10 +546,6 @@ class TypedDictProperty implements PythonNode { return this.type.optional || false; } - public requiredTypes(): string[] { - return [toPythonType(this.type)]; - } - public emit(code: CodeMaker) { const propType: string = formatPythonType(toPythonType(this.type, false), undefined, this.moduleName); code.line(`${this.name}: ${propType}`); @@ -608,16 +578,6 @@ class TypedDict implements PythonCollectionNode { return member; } - public requiredTypes(): string[] { - const types: string[] = []; - - for (const member of this.members) { - types.push(...member.requiredTypes()); - } - - return types; - } - public emit(code: CodeMaker) { // MyPy doesn't let us mark some keys as optional, and some keys as mandatory, // we can either mark either the entire class as mandatory or the entire class @@ -732,16 +692,6 @@ class Class implements PythonCollectionNode { return member; } - public requiredTypes(): string[] { - const types: string[] = []; - - for (const member of this.members) { - types.push(...member.requiredTypes()); - } - - return types; - } - public emit(code: CodeMaker) { const classParams: string[] = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); @@ -785,10 +735,6 @@ class Enum implements PythonCollectionNode { return member; } - public requiredTypes(): string[] { - return ["enum.Enum"]; - } - public emit(code: CodeMaker) { code.openBlock(`class ${this.name}(enum.Enum)`); if (this.members.length > 0) { @@ -818,10 +764,6 @@ class EnumMember implements PythonNode { return `${this.moduleName}.${this.name}`; } - public requiredTypes(): string[] { - return []; - } - public emit(code: CodeMaker) { code.line(`${this.name} = "${this.value}"`); } @@ -830,20 +772,21 @@ class EnumMember implements PythonNode { class Module { public readonly name: string; - public readonly assembly?: spec.Assembly; - public readonly assemblyFilename?: string; + public readonly assembly: spec.Assembly; + public readonly assemblyFilename: string; + public readonly loadAssembly: boolean; private members: PythonCollectionNode[]; + private subModules: string[]; - constructor(ns: string, assembly?: [spec.Assembly, string]) { + constructor(ns: string, assembly: spec.Assembly, assemblyFilename: string, loadAssembly: boolean = false) { this.name = ns; - - if (assembly !== undefined) { - this.assembly = assembly[0]; - this.assemblyFilename = assembly[1]; - } + this.assembly = assembly; + this.assemblyFilename = assemblyFilename; + this.loadAssembly = loadAssembly; this.members = []; + this.subModules = []; } public addMember(member: PythonCollectionNode): PythonCollectionNode { @@ -851,9 +794,17 @@ class Module { return member; } + public addSubmodule(module: string) { + this.subModules.push(module); + } + public emit(code: CodeMaker) { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. + code.line("import datetime"); + code.line("import enum"); + code.line("import typing"); + code.line(); code.line("import jsii"); code.line("import publication"); code.line(); @@ -862,16 +813,30 @@ class Module { // Go over all of the modules that we need to import, and import them. // for (let [idx, modName] of this.importedModules.sort().entries()) { - for (const [idx, modName] of this.getRequiredTypeImports().sort().entries()) { + const dependencies = Object.keys(this.assembly.dependencies || {}); + for (const [idx, depName] of dependencies.sort().entries()) { + // If this our first dependency, add a blank line to format our imports + // slightly nicer. if (idx === 0) { code.line(); } - code.line(`import ${modName}`); + code.line(`import ${toPythonModuleName(depName)}`); + } + + const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.`); + for (const [idx, subModule] of this.subModules.sort().entries()) { + // If this our first subModule, add a blank line to format our imports + // slightly nicer. + if (idx === 0) { + code.line(); + } + + code.line(`from . import ${subModule.replace(moduleRe, "")}`); } // Determine if we need to write out the kernel load line. - if (this.assembly && this.assemblyFilename) { + if (this.loadAssembly) { code.line( `__jsii_assembly__ = jsii.JSIIAssembly.load(` + `"${this.assembly.name}", ` + @@ -896,66 +861,6 @@ class Module { code.line("publication.publish()"); } - private getRequiredTypeImports(): string[] { - const types: string[] = []; - const imports: string[] = []; - - // Compute a list of all of of the types that - for (const member of this.members) { - types.push(...member.requiredTypes()); - } - - // Go over our types, and generate a list of imports that we need to import for - // our module. - for (const type of types) { - // If we split our types by any of the "special" characters that can't appear in - // identifiers (like "[],") then we will get a list of all of the identifiers, - // no matter how nested they are. The downside is we might get trailing/leading - // spaces or empty items so we'll need to trim and filter this list. - const subTypes = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); - - // Loop over all of the types we've discovered, and check them for being - // importable - for (const subType of subTypes) { - // For built in types, we don't need to do anything, and can just move on. - if (PYTHON_BUILTIN_TYPES.indexOf(subType) > -1) { continue; } - - const [, typeModule] = subType.match(/(.*)\.(.*)/) as any[]; - - // Given a name like foo.bar.Frob, we want to import the module that Frob exists - // in. Given that all classes exported by JSII have to be pascal cased, and all - // of our imports are snake cases, this should be safe. We're going to double - // check this though, to ensure that our importable here is safe. - if (typeModule !== typeModule.toLowerCase()) { - // If we ever get to this point, we'll need to implment aliasing for our - // imports. - throw new Error(`Type module is not lower case: '${typeModule}'`); - } - - // We only want to actually import the type for this module, if it isn't the - // module that we're currently in, otherwise we'll jus rely on the module scope - // to make the name available to us. - if (typeModule !== this.name && imports.indexOf(typeModule) === -1) { - imports.push(typeModule); - } - } - } - - // Add the additional dependencies that we require in order for imports to - // work correctly. These are dependencies at the JS level, isntead of at the - // Python level. - if (this.assembly !== undefined && this.assembly!.dependencies !== undefined) { - for (const depName of Object.keys(this.assembly!.dependencies!)) { - const moduleName = toPythonModuleName(depName); - if (imports.indexOf(moduleName) === -1) { - imports.push(moduleName); - } - } - } - - return imports; - } - private getExportedNames(): string[] { // We assume that anything that is a member of this module, will be exported by // this module. @@ -963,10 +868,14 @@ class Module { // If this module will be outputting the Assembly, then we also want to export // our assembly variable. - if (this.assembly && this.assemblyFilename) { + if (this.loadAssembly) { exportedNames.push("__jsii_assembly__"); } + // We also need to export all of our submodules. + const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.`); + exportedNames.push(...this.subModules.map(item => item.replace(moduleRe, ""))); + return exportedNames.sort(); } @@ -1065,15 +974,12 @@ class PythonGenerator extends Generator { protected onBeginNamespace(ns: string) { const moduleName = toPythonModuleName(ns); const loadAssembly = this.assembly.name === ns ? true : false; + const mod = new Module(moduleName, this.assembly, this.getAssemblyFileName(), loadAssembly); - const moduleArgs: any[] = []; - - if (loadAssembly) { - moduleArgs.push([this.assembly, this.getAssemblyFileName()]); + for (const parentMod of this.moduleStack) { + parentMod.addSubmodule(moduleName); } - const mod = new Module(moduleName, ...moduleArgs); - this.modules.push(mod); this.moduleStack.push(mod); } @@ -1239,13 +1145,9 @@ class PythonGenerator extends Generator { protected onBeginEnum(enm: spec.EnumType) { const currentModule = this.currentModule(); + const newMember = new Enum(currentModule.name, toPythonIdentifier(enm.name)); - this.currentMember = currentModule.addMember( - new Enum( - currentModule.name, - toPythonIdentifier(enm.name), - ) - ); + this.currentMember = currentModule.addMember(newMember); } protected onEndEnum(_enm: spec.EnumType) { diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index fc956f1009..405130a07c 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -20,8 +20,10 @@ "aws" ], "dependencies": { + "@types/escape-string-regexp": "^1.0.0", "clone": "^2.1.1", "codemaker": "^0.7.7", + "escape-string-regexp": "^1.0.5", "fs-extra": "^4.0.3", "jsii-spec": "^0.7.7", "spdx-license-list": "^4.1.0", From a964267b9338fb0feb2926aa9eb7f0eb8f63d4f9 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Mon, 22 Oct 2018 15:31:37 -0400 Subject: [PATCH 068/117] Handle variadic parameters --- packages/jsii-pacmak/lib/targets/python.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index f73b4dbaf1..d84273f3fd 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -333,6 +333,17 @@ class BaseMethod implements PythonNode { pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}${paramDefault}`); } } + } else if (this.parameters.length >= 1 && this.parameters.slice(-1)[0].variadic) { + // Another situation we could be in, is that instead of having a plain parameter + // we have a variadic parameter where we need to expand the last parameter as a + // *args. + pythonParams.pop(); + + const lastParameter = this.parameters.slice(-1)[0]; + const paramName = toPythonIdentifier(lastParameter.name); + const paramType = toPythonType(lastParameter.type, false); + + pythonParams.push(`*${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); } if (this.decorator !== undefined) { From 4575e855d0551510bbbd1616da09d83005cb9236 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 24 Oct 2018 09:35:05 -0400 Subject: [PATCH 069/117] Massive refactor to greatly simplify Python generator --- packages/jsii-pacmak/lib/targets/python.ts | 1320 ++++++++++---------- packages/jsii-pacmak/package.json | 2 - 2 files changed, 669 insertions(+), 653 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index d84273f3fd..8175f7908f 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -2,7 +2,6 @@ import path = require('path'); import util = require('util'); import { CodeMaker, toSnakeCase } from 'codemaker'; -import * as escapeStringRegexp from 'escape-string-regexp'; import * as spec from 'jsii-spec'; import { Generator, GeneratorOptions } from '../generator'; import { Target, TargetOptions } from '../target'; @@ -31,7 +30,7 @@ export default class Python extends Target { // ################## // # CODE GENERATOR # // ################## -const debug = (o: any) => { +export const debug = (o: any) => { // tslint:disable-next-line:no-console console.log(util.inspect(o, false, null, true)); }; @@ -56,15 +55,8 @@ const toPythonModuleName = (name: string): string => { return name; }; -const toPythonModuleFilename = (name: string): string => { - if (name.match(/^@[^/]+\/[^/]+$/)) { - name = name.replace(/^@/g, ""); - name = name.replace(/\//g, "."); - } - - name = name.replace(/\./g, "/"); - - return name; +const pythonModuleNameToFilename = (name: string): string => { + return name.replace(/\./g, "/"); }; const toPythonPackageName = (name: string): string => { @@ -87,109 +79,6 @@ const toPythonPropertyName = (name: string): string => { return toPythonIdentifier(toSnakeCase(name)); }; -const toPythonType = (typeref: spec.TypeReference, respectOptional: boolean = true): string => { - let pythonType: string; - - // Get the underlying python type. - if (spec.isPrimitiveTypeReference(typeref)) { - pythonType = toPythonPrimitive(typeref.primitive); - } else if (spec.isCollectionTypeReference(typeref)) { - pythonType = toPythonCollection(typeref); - } else if (spec.isNamedTypeReference(typeref)) { - pythonType = toPythonFQN(typeref.fqn); - } else if (typeref.union) { - const types = new Array(); - for (const subtype of typeref.union.types) { - types.push(toPythonType(subtype)); - } - pythonType = `typing.Union[${types.join(", ")}]`; - } else { - throw new Error("Invalid type reference: " + JSON.stringify(typeref)); - } - - // If our type is Optional, then we'll wrap our underlying type with typing.Optional - // However, if we're not respecting optionals, then we'll just skip over this. - if (respectOptional && typeref.optional) { - pythonType = `typing.Optional[${pythonType}]`; - } - - return pythonType; -}; - -const toPythonCollection = (ref: spec.CollectionTypeReference) => { - const elementPythonType = toPythonType(ref.collection.elementtype); - switch (ref.collection.kind) { - case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; - case spec.CollectionKind.Map: return `typing.Mapping[str,${elementPythonType}]`; - default: - throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); - } -}; - -const toPythonPrimitive = (primitive: spec.PrimitiveType): string => { - switch (primitive) { - case spec.PrimitiveType.Boolean: return "bool"; - case spec.PrimitiveType.Date: return "datetime.datetime"; - case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; - case spec.PrimitiveType.Number: return "jsii.Number"; - case spec.PrimitiveType.String: return "str"; - case spec.PrimitiveType.Any: return "typing.Any"; - default: - throw new Error("Unknown primitive type: " + primitive); - } -}; - -const toPythonFQN = (name: string): string => { - const [, modulePart, typePart] = name.match(/^((?:[^A-Z\.][^\.]+\.?)+)\.([A-Z].+)$/) as string[]; - const fqnParts = [ - toPythonModuleName(modulePart), - typePart.split(".").map(cur => toPythonIdentifier(cur)).join(".") - ]; - - return fqnParts.join("."); -}; - -const formatPythonType = (type: string, forwardReference: boolean = false, moduleName: string) => { - // If we split our types by any of the "special" characters that can't appear in - // identifiers (like "[],") then we will get a list of all of the identifiers, - // no matter how nested they are. The downside is we might get trailing/leading - // spaces or empty items so we'll need to trim and filter this list. - const types = type.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); - // const moduleRe = new RegExp(`^${escapeStringRegexp(moduleName)}\.([A-Z].+)$`); - - for (const innerType of types) { - // Built in types do not need formatted in any particular way. - if (PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { - continue; - } - - // If we do not have a current moduleName, or the type is not within that - // module, then we don't format it any particular way. - // if (!moduleRe.test(innerType)) { - if (!innerType.startsWith(moduleName + ".")) { - continue; - } else { - const typeName = innerType.substring(moduleName.length + 1, innerType.length); - // const [, typeName] = innerType.match(moduleRe) as string[]; - const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); - - // If this is our current module, then we need to correctly handle our - // forward references, by placing the type inside of quotes, unless - // we're returning real forward references. - if (!forwardReference && !typeName.match(/^[a-z]/)) { - type = type.replace(re, `$1"${innerType}"$2`); - } - - // Now that we've handled (or not) our forward references, then we want - // to replace the module with just the type name. - // type = type.replace(re, "$1" + innerType.substring(moduleName.length + 1, innerType.length) + "$2"); - type = type.replace(re, `$1${typeName}$2`); - } - } - - return type; -}; - const setDifference = (setA: Set, setB: Set): Set => { const difference = new Set(setA); for (const elem of setB) { @@ -198,77 +87,142 @@ const setDifference = (setA: Set, setB: Set): Set => { return difference; }; -const sortMembers = (sortable: PythonCollectionNode[]): PythonCollectionNode[] => { - const sorted: PythonCollectionNode[] = []; - const sortedFQNs: Set = new Set(); +const sortMembers = (sortable: PythonBase[], resolver: TypeResolver): PythonBase[] => { + const sorted: PythonBase[] = []; + const seen: Set = new Set(); // We're going to take a copy of our sortable item, because it'll make it easier if // this method doesn't have side effects. sortable = sortable.slice(); - while (sortable.length > 0) { - let idx: number | undefined; + // The first thing we want to do, is push any item which is not sortable to the very + // front of the list. This will be things like methods, properties, etc. + for (const item of sortable) { + if (!isSortableType(item)) { + sorted.push(item); + seen.add(item); + } + } + sortable = sortable.filter(i => !seen.has(i)); - for (const [idx2, item] of sortable.entries()) { - if (setDifference(new Set(item.depends_on), sortedFQNs).size === 0) { + // Now that we've pulled out everything that couldn't possibly have dependencies, + // we will go through the remaining items, and pull off any items which have no + // dependencies that we haven't already sorted. + while (sortable.length > 0) { + for (const item of (sortable as Array)) { + const itemDeps: Set = new Set(item.dependsOn(resolver).map(i => resolver.getType(i))); + if (setDifference(itemDeps, seen).size === 0) { sorted.push(item); - sortedFQNs.add(item.fqn); - idx = idx2; + seen.add(item); + break; - } else { - idx = undefined; } } - if (idx === undefined) { + const leftover = sortable.filter(i => !seen.has(i)); + if (leftover === sortable) { throw new Error("Could not sort members."); } else { - sortable.splice(idx, 1); + sortable = leftover; } } return sorted; }; -const isInModule = (modName: string, fqn: string): boolean => { - return new RegExp(`^${escapeStringRegexp(modName)}\.[^\.]+$`).test(fqn); -}; +interface PythonBase { + readonly name: string; -interface PythonNode { + emit(code: CodeMaker, resolver: TypeResolver): void; +} - // The name of the module that this Node exists in. - readonly moduleName: string; +interface PythonType extends PythonBase { + // The JSII FQN for this item, if this item doesn't exist as a JSII type, then it + // doesn't have a FQN and it should be null; + readonly fqn: string | null; - // The name of the given Node. - readonly name: string; + addMember(member: PythonBase): void; +} - // The fully qualifed name of this node. - readonly fqn: string; +interface ISortableType { + dependsOn(resolver: TypeResolver): spec.NamedTypeReference[]; +} - // Emits the entire tree of objects represented by this object into the given - // CodeMaker object. - emit(code: CodeMaker): void; +function isSortableType(arg: any): arg is ISortableType { + return arg.dependsOn !== undefined; } -interface PythonCollectionNode extends PythonNode { - // A list of other nodes that this node depends on, can be used to sort a list of - // nodes so that nodes get emited *after* the nodes it depends on. - readonly depends_on: string[]; +interface PythonTypeOpts { + bases?: spec.TypeReference[]; +} - // Given a particular item, add it as a member of this collection of nodes, returns - // the original member back. - addMember(member: PythonNode): PythonNode; +abstract class BasePythonClassType implements PythonType, ISortableType { + + public readonly name: string; + public readonly fqn: string | null; + + protected bases: spec.TypeReference[]; + protected members: PythonBase[]; + + constructor(name: string, fqn: string, opts: PythonTypeOpts) { + const { + bases = [], + } = opts; + + this.name = name; + this.fqn = fqn; + this.bases = bases; + this.members = []; + } + + public dependsOn(resolver: TypeResolver): spec.NamedTypeReference[] { + const dependencies: spec.NamedTypeReference[] = []; + + // We need to return any bases that are in the same module. + for (const base of this.bases) { + if (spec.isNamedTypeReference(base)) { + if (resolver.isInModule(base)) { + dependencies.push(base); + } + } + } + + return dependencies; + } + + public addMember(member: PythonBase) { + this.members.push(member); + } + + public emit(code: CodeMaker, resolver: TypeResolver) { + code.openBlock(`class ${this.name}(${this.getClassParams(resolver).join(", ")})`); + + if (this.members.length > 0) { + for (const member of sortMembers(this.members, resolver)) { + member.emit(code, resolver); + } + } else { + code.line("pass"); + } + + code.closeBlock(); + } + + protected abstract getClassParams(resolver: TypeResolver): string[]; +} + +interface BaseMethodOpts { + liftedProp?: spec.InterfaceType, + parent?: spec.NamedTypeReference, } -class BaseMethod implements PythonNode { +abstract class BaseMethod implements PythonBase { - public readonly moduleName: string; - public readonly parent: PythonCollectionNode; public readonly name: string; - protected readonly decorator?: string; - protected readonly implicitParameter: string; + protected readonly abstract implicitParameter: string; protected readonly jsiiMethod?: string; + protected readonly decorator?: string; protected readonly classAsFirstParameter: boolean = false; protected readonly returnFromJSIIMethod: boolean = true; @@ -276,40 +230,38 @@ class BaseMethod implements PythonNode { private readonly parameters: spec.Parameter[]; private readonly returns?: spec.TypeReference; private readonly liftedProp?: spec.InterfaceType; + private readonly parent?: spec.NamedTypeReference; - constructor(moduleName: string, - parent: PythonCollectionNode, - name: string, + constructor(name: string, jsName: string | undefined, parameters: spec.Parameter[], returns?: spec.TypeReference, - liftedProp?: spec.InterfaceType) { - this.moduleName = moduleName; - this.parent = parent; + opts: BaseMethodOpts = {}) { this.name = name; this.jsName = jsName; this.parameters = parameters; this.returns = returns; - this.liftedProp = liftedProp; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; + this.liftedProp = opts.liftedProp; + this.parent = opts.parent; } - public emit(code: CodeMaker) { - const returnType = this.getReturnType(this.returns); + public emit(code: CodeMaker, resolver: TypeResolver) { + let returnType: string; + if (this.returns !== undefined) { + returnType = resolver.resolve(this.returns, { forwardReferences: false }); + } else { + returnType = "None"; + } // We need to turn a list of JSII parameters, into Python style arguments with // gradual typing, so we'll have to iterate over the list of parameters, and // build the list, converting as we go. - // TODO: Handle imports (if needed) for all of these types. const pythonParams: string[] = [this.implicitParameter]; for (const param of this.parameters) { const paramName = toPythonIdentifier(param.name); - const paramType = toPythonType(param.type); + const paramType = resolver.resolve(param.type, { forwardReferences: false}); - pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); + pythonParams.push(`${paramName}: ${paramType}`); } // If we have a lifted parameter, then we'll drop the last argument to our params @@ -327,10 +279,10 @@ class BaseMethod implements PythonNode { // Iterate over all of our props, and reflect them into our params. for (const prop of this.liftedProp.properties) { const paramName = toPythonIdentifier(prop.name); - const paramType = toPythonType(prop.type); + const paramType = resolver.resolve(prop.type, { forwardReferences: false }); const paramDefault = prop.type.optional ? "=None" : ""; - pythonParams.push(`${paramName}: ${formatPythonType(paramType, false, this.moduleName)}${paramDefault}`); + pythonParams.push(`${paramName}: ${paramType}${paramDefault}`); } } } else if (this.parameters.length >= 1 && this.parameters.slice(-1)[0].variadic) { @@ -341,36 +293,39 @@ class BaseMethod implements PythonNode { const lastParameter = this.parameters.slice(-1)[0]; const paramName = toPythonIdentifier(lastParameter.name); - const paramType = toPythonType(lastParameter.type, false); + const paramType = resolver.resolve( + lastParameter.type, + { forwardReferences: false, ignoreOptional: true }, + ); - pythonParams.push(`*${paramName}: ${formatPythonType(paramType, false, this.moduleName)}`); + pythonParams.push(`*${paramName}: ${paramType}`); } if (this.decorator !== undefined) { code.line(`@${this.decorator}`); } - code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - this.emitBody(code); + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${returnType}`); + this.emitBody(code, resolver); code.closeBlock(); } - private emitBody(code: CodeMaker) { + private emitBody(code: CodeMaker, resolver: TypeResolver) { if (this.jsiiMethod === undefined) { code.line("..."); } else { if (this.liftedProp !== undefined) { - this.emitAutoProps(code); + this.emitAutoProps(code, resolver); } - this.emitJsiiMethodCall(code); + this.emitJsiiMethodCall(code, resolver); } } - private emitAutoProps(code: CodeMaker) { + private emitAutoProps(code: CodeMaker, resolver: TypeResolver) { const lastParameter = this.parameters.slice(-1)[0]; - const argName: string = toPythonIdentifier(lastParameter.name); - const typeName: string = formatPythonType(toPythonType(lastParameter.type), true, this.moduleName); + const argName = toPythonIdentifier(lastParameter.name); + const typeName = resolver.resolve(lastParameter.type); // We need to build up a list of properties, which are mandatory, these are the // ones we will specifiy to start with in our dictionary literal. @@ -398,12 +353,15 @@ class BaseMethod implements PythonNode { } } - private emitJsiiMethodCall(code: CodeMaker) { + private emitJsiiMethodCall(code: CodeMaker, resolver: TypeResolver) { const methodPrefix: string = this.returnFromJSIIMethod ? "return " : ""; const jsiiMethodParams: string[] = []; if (this.classAsFirstParameter) { - jsiiMethodParams.push(this.parent.name); + if (this.parent === undefined) { + throw new Error("Parent not known."); + } + jsiiMethodParams.push(resolver.resolve(this.parent)); } jsiiMethodParams.push(this.implicitParameter); if (this.jsName !== undefined) { @@ -417,69 +375,71 @@ class BaseMethod implements PythonNode { code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); } +} - private getReturnType(type?: spec.TypeReference): string { - return type ? toPythonType(type) : "None"; - } +interface BasePropertyOpts { + immutable?: boolean; } -class BaseProperty implements PythonNode { +abstract class BaseProperty implements PythonBase { - public readonly moduleName: string; public readonly name: string; - protected readonly decorator: string; - protected readonly implicitParameter: string; + protected readonly abstract decorator: string; + protected readonly abstract implicitParameter: string; protected readonly jsiiGetMethod?: string; protected readonly jsiiSetMethod?: string; - protected readonly jsName: string; + private readonly jsName: string; private readonly type: spec.TypeReference; private readonly immutable: boolean; - constructor(moduleName: string, name: string, jsName: string, type: spec.TypeReference, immutable: boolean) { - this.moduleName = moduleName; + constructor(name: string, jsName: string, type: spec.TypeReference, opts: BasePropertyOpts = {}) { + const { + immutable = false, + } = opts; + this.name = name; this.jsName = jsName; this.type = type; this.immutable = immutable; } - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - public emit(code: CodeMaker) { - const returnType = toPythonType(this.type); + public emit(code: CodeMaker, resolver: TypeResolver) { + const pythonType = resolver.resolve(this.type, { forwardReferences: false }); code.line(`@${this.decorator}`); - code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${formatPythonType(returnType, false, this.moduleName)}`); - this.emitGetterBody(code); + code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${pythonType}`); + if (this.jsiiGetMethod !== undefined) { + code.line(`return jsii.${this.jsiiGetMethod}(${this.implicitParameter}, "${this.jsName}")`); + } else { + code.line("..."); + } code.closeBlock(); if (!this.immutable) { code.line(`@${this.name}.setter`); - code.openBlock(`def ${this.name}(${this.implicitParameter}, value: ${formatPythonType(returnType, false, this.moduleName)})`); - this.emitSetterBody(code); + code.openBlock(`def ${this.name}(${this.implicitParameter}, value: ${pythonType})`); + if (this.jsiiSetMethod !== undefined) { + code.line(`return jsii.${this.jsiiSetMethod}(${this.implicitParameter}, "${this.jsName}", value)`); + } else { + code.line("..."); + } code.closeBlock(); } } +} - private emitGetterBody(code: CodeMaker) { - if (this.jsiiGetMethod === undefined) { - code.line("..."); - } else { - code.line(`return jsii.${this.jsiiGetMethod}(${this.implicitParameter}, "${this.jsName}")`); - } - } +class Interface extends BasePythonClassType { - private emitSetterBody(code: CodeMaker) { - if (this.jsiiSetMethod === undefined) { - code.line("..."); - } else { - code.line(`return jsii.${this.jsiiSetMethod}(${this.implicitParameter}, "${this.jsName}", value)`); - } + protected getClassParams(resolver: TypeResolver): string[] { + const params: string[] = this.bases.map(b => resolver.resolve(b)); + + params.push("jsii.compat.Protocol"); + + return params; } + } class InterfaceMethod extends BaseMethod { @@ -491,113 +451,23 @@ class InterfaceProperty extends BaseProperty { protected readonly implicitParameter: string = "self"; } -class Interface implements PythonCollectionNode { - - public readonly moduleName: string; - public readonly name: string; - - private bases: string[]; - private members: PythonNode[]; - - constructor(moduleName: string, name: string, bases: string[]) { - this.moduleName = moduleName; - this.name = name; - this.bases = bases; - - this.members = []; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - get depends_on(): string[] { - return this.bases.filter(base => isInModule(this.moduleName, base)); - } - - public addMember(member: PythonNode): PythonNode { - this.members.push(member); - return member; - } - - public emit(code: CodeMaker) { - const interfaceBases = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); - interfaceBases.push("_Protocol"); - - code.openBlock(`class ${this.name}(${interfaceBases.join(",")})`); - if (this.members.length > 0) { - for (const member of this.members) { - member.emit(code); - } - } else { - code.line("pass"); - } - code.closeBlock(); - } -} - -class TypedDictProperty implements PythonNode { - - public readonly moduleName: string; - public readonly name: string; - - private readonly type: spec.TypeReference; - - constructor(moduleName: string, name: string, type: spec.TypeReference) { - this.moduleName = moduleName; - this.name = name; - this.type = type; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - get optional(): boolean { - return this.type.optional || false; - } - - public emit(code: CodeMaker) { - const propType: string = formatPythonType(toPythonType(this.type, false), undefined, this.moduleName); - code.line(`${this.name}: ${propType}`); - } -} - -class TypedDict implements PythonCollectionNode { - public readonly moduleName: string; - public readonly name: string; - - private members: TypedDictProperty[]; - - constructor(moduleName: string, name: string) { - this.moduleName = moduleName; - this.name = name; - - this.members = []; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - get depends_on(): string[] { - return []; - } - - public addMember(member: TypedDictProperty): TypedDictProperty { - this.members.push(member); - return member; - } +class TypedDict extends BasePythonClassType { - public emit(code: CodeMaker) { + public emit(code: CodeMaker, resolver: TypeResolver) { // MyPy doesn't let us mark some keys as optional, and some keys as mandatory, // we can either mark either the entire class as mandatory or the entire class // as optional. However, we can make two classes, one with all mandatory keys // and one with all optional keys in order to emulate this. So we'll go ahead // and implement this "split" class logic. - const mandatoryMembers = this.members.filter(item => !item.optional); - const optionalMembers = this.members.filter(item => item.optional); + const classParams = this.getClassParams(resolver); + + const mandatoryMembers = this.members.filter( + item => item instanceof TypedDictProperty ? !item.optional : true + ); + const optionalMembers = this.members.filter( + item => item instanceof TypedDictProperty ? item.optional : false + ); if (mandatoryMembers.length >= 1 && optionalMembers.length >= 1) { // In this case, we have both mandatory *and* optional members, so we'll @@ -605,16 +475,16 @@ class TypedDict implements PythonCollectionNode { // We'll emit the optional members first, just because it's a little nicer // for the final class in the chain to have the mandatory members. - code.openBlock(`class _${this.name}(_TypedDict, total=False)`); + code.openBlock(`class _${this.name}(${classParams.concat(["total=False"]).join(", ")})`); for (const member of optionalMembers) { - member.emit(code); + member.emit(code, resolver); } code.closeBlock(); // Now we'll emit the mandatory members. code.openBlock(`class ${this.name}(_${this.name})`); - for (const member of mandatoryMembers) { - member.emit(code); + for (const member of sortMembers(mandatoryMembers, resolver)) { + member.emit(code, resolver); } code.closeBlock(); } else { @@ -622,15 +492,15 @@ class TypedDict implements PythonCollectionNode { // we'll see if we have any optional members, if we don't then we'll use // total=True instead of total=False for the class. if (optionalMembers.length >= 1) { - code.openBlock(`class ${this.name}(_TypedDict, total=False)`); + code.openBlock(`class ${this.name}(${classParams.concat(["total=False"]).join(", ")})`); } else { - code.openBlock(`class ${this.name}(_TypedDict)`); + code.openBlock(`class ${this.name}(${classParams.join(", ")})`); } // Finally we'll just iterate over and emit all of our members. if (this.members.length > 0) { - for (const member of this.members) { - member.emit(code); + for (const member of sortMembers(this.members, resolver)) { + member.emit(code, resolver); } } else { code.line("pass"); @@ -639,6 +509,52 @@ class TypedDict implements PythonCollectionNode { code.closeBlock(); } } + + protected getClassParams(resolver: TypeResolver): string[] { + const params: string[] = this.bases.map(b => resolver.resolve(b)); + + params.push("jsii.compat.TypedDict"); + + return params; + } + +} + +class TypedDictProperty implements PythonBase { + + public readonly name: string; + + private readonly type: spec.TypeReference; + + constructor(name: string, type: spec.TypeReference) { + this.name = name; + this.type = type; + } + + get optional(): boolean { + return this.type.optional !== undefined ? this.type.optional : false; + } + + public emit(code: CodeMaker, resolver: TypeResolver) { + const resolvedType = resolver.resolve( + this.type, + { forwardReferences: false, ignoreOptional: true } + ); + code.line(`${this.name}: ${resolvedType}`); + } +} + +class Class extends BasePythonClassType { + + protected getClassParams(resolver: TypeResolver): string[] { + const params: string[] = this.bases.map(b => resolver.resolve(b)); + + params.push("metaclass=jsii.JSIIMeta"); + params.push(`jsii_type="${this.fqn}"`); + + return params; + } + } class StaticMethod extends BaseMethod { @@ -673,143 +589,63 @@ class Property extends BaseProperty { protected readonly jsiiSetMethod: string = "set"; } -class Class implements PythonCollectionNode { - public readonly moduleName: string; - public readonly name: string; - - private jsiiFQN: string; - private bases: string[]; - private members: PythonNode[]; - - constructor(moduleName: string, name: string, jsiiFQN: string, bases: string[]) { - this.moduleName = moduleName; - this.name = name; - - this.jsiiFQN = jsiiFQN; - this.bases = bases; - this.members = []; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } +class Enum extends BasePythonClassType { - get depends_on(): string[] { - return this.bases.filter(base => isInModule(this.moduleName, base)); + protected getClassParams(_resolver: TypeResolver): string[] { + return ["enum.Enum"]; } - public addMember(member: PythonNode): PythonNode { - this.members.push(member); - return member; - } - - public emit(code: CodeMaker) { - const classParams: string[] = this.bases.map(baseType => formatPythonType(baseType, true, this.moduleName)); - - classParams.push("metaclass=jsii.JSIIMeta"); - classParams.push(`jsii_type="${this.jsiiFQN}"`); - - code.openBlock(`class ${this.name}(${classParams.join(", ")})`); - if (this.members.length > 0) { - for (const member of this.members) { - member.emit(code); - } - } else { - code.line("pass"); - } - code.closeBlock(); - } } -class Enum implements PythonCollectionNode { - public readonly moduleName: string; - public readonly name: string; - - private members: PythonNode[]; - - constructor(moduleName: string, name: string) { - this.moduleName = moduleName; - this.name = name; - this.members = []; - } - - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - get depends_on(): string[] { - return []; - } - - public addMember(member: PythonNode): PythonNode { - this.members.push(member); - return member; - } +class EnumMember implements PythonBase { - public emit(code: CodeMaker) { - code.openBlock(`class ${this.name}(enum.Enum)`); - if (this.members.length > 0) { - for (const member of this.members) { - member.emit(code); - } - } else { - code.line("pass"); - } - code.closeBlock(); - } -} - -class EnumMember implements PythonNode { - public readonly moduleName: string; public readonly name: string; private readonly value: string; - constructor(moduleName: string, name: string, value: string) { - this.moduleName = moduleName; + constructor(name: string, value: string) { this.name = name; this.value = value; } - get fqn(): string { - return `${this.moduleName}.${this.name}`; - } - - public emit(code: CodeMaker) { + public emit(code: CodeMaker, _resolver: TypeResolver) { code.line(`${this.name} = "${this.value}"`); } } -class Module { +interface ModuleOpts { + assembly: spec.Assembly, + assemblyFilename: string; + loadAssembly: boolean; +} + +class Module implements PythonType { public readonly name: string; - public readonly assembly: spec.Assembly; - public readonly assemblyFilename: string; - public readonly loadAssembly: boolean; + public readonly fqn: string | null; - private members: PythonCollectionNode[]; - private subModules: string[]; + private assembly: spec.Assembly; + private assemblyFilename: string; + private loadAssembly: boolean; + private members: PythonBase[]; - constructor(ns: string, assembly: spec.Assembly, assemblyFilename: string, loadAssembly: boolean = false) { - this.name = ns; - this.assembly = assembly; - this.assemblyFilename = assemblyFilename; - this.loadAssembly = loadAssembly; + constructor(name: string, fqn: string | null, opts: ModuleOpts) { + this.name = name; + this.fqn = fqn; + this.assembly = opts.assembly; + this.assemblyFilename = opts.assemblyFilename; + this.loadAssembly = opts.loadAssembly; this.members = []; - this.subModules = []; } - public addMember(member: PythonCollectionNode): PythonCollectionNode { + public addMember(member: PythonBase) { this.members.push(member); - return member; } - public addSubmodule(module: string) { - this.subModules.push(module); - } + public emit(code: CodeMaker, resolver: TypeResolver) { + resolver = this.fqn ? resolver.bind(this.fqn) : resolver; - public emit(code: CodeMaker) { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. code.line("import datetime"); @@ -817,9 +653,9 @@ class Module { code.line("import typing"); code.line(); code.line("import jsii"); + code.line("import jsii.compat"); code.line("import publication"); code.line(); - code.line(this.generateImportFrom("jsii.compat", ["Protocol", "TypedDict"])); code.line("from jsii.python import classproperty"); // Go over all of the modules that we need to import, and import them. @@ -835,17 +671,6 @@ class Module { code.line(`import ${toPythonModuleName(depName)}`); } - const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.`); - for (const [idx, subModule] of this.subModules.sort().entries()) { - // If this our first subModule, add a blank line to format our imports - // slightly nicer. - if (idx === 0) { - code.line(); - } - - code.line(`from . import ${subModule.replace(moduleRe, "")}`); - } - // Determine if we need to write out the kernel load line. if (this.loadAssembly) { code.line( @@ -857,347 +682,544 @@ class Module { ); } - // Now that we've gotten all of the module header stuff done, we need to go - // through and actually write out the meat of our module. - for (const member of sortMembers(this.members)) { - member.emit(code); + // Emit all of our members. + for (const member of sortMembers(this.members, resolver)) { + member.emit(code, resolver); } // Whatever names we've exported, we'll write out our __all__ that lists them. - code.line(`__all__ = [${this.getExportedNames().map(s => `"${s}"`).join(", ")}]`); + code.line(`__all__ = [${this.members.map(m => `"${m.name}"`).sort().join(", ")}]`); // Finally, we'll use publication to ensure that all of the non-public names // get hidden from dir(), tab-complete, etc. code.line(); code.line("publication.publish()"); } +} - private getExportedNames(): string[] { - // We assume that anything that is a member of this module, will be exported by - // this module. - const exportedNames = this.members.map(m => m.name); - - // If this module will be outputting the Assembly, then we also want to export - // our assembly variable. - if (this.loadAssembly) { - exportedNames.push("__jsii_assembly__"); - } - - // We also need to export all of our submodules. - const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.`); - exportedNames.push(...this.subModules.map(item => item.replace(moduleRe, ""))); - - return exportedNames.sort(); - - } +interface PackageMetadata { + summary?: string; + readme?: string; + url?: string; +} - private generateImportFrom(from: string, names: string[]): string { - // Whenever we import something, we want to prefix all of the names we're - // importing with an underscore to indicate that these names are private. We - // do this, because otherwise we could get clashes in the names we use, and the - // names of exported classes. - const importNames = names.map(n => `${n} as _${n}`); - return `from ${from} import ${importNames.join(", ")}`; - } +interface PackageData { + filename: string; + data: string | null; } -class PythonGenerator extends Generator { +class Package { - private currentMember?: PythonCollectionNode; - private modules: Module[]; - private moduleStack: Module[]; + public readonly name: string; + public readonly version: string; + public readonly metadata: PackageMetadata; - constructor(options = new GeneratorOptions()) { - super(options); + private modules: Map; + private data: Map; - this.code.openBlockFormatter = s => `${s}:`; - this.code.closeBlockFormatter = _s => ""; + constructor(name: string, version: string, metadata: PackageMetadata) { + this.name = name; + this.version = version; + this.metadata = metadata; - this.currentMember = undefined; - this.modules = []; - this.moduleStack = []; + this.modules = new Map(); + this.data = new Map(); } - protected getAssemblyOutputDir(mod: spec.Assembly) { - return path.join("src", toPythonModuleFilename(toPythonModuleName(mod.name)), "_jsii"); + public addModule(module: Module) { + this.modules.set(module.name, module); } - protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { - // We need to write out an __init__.py for our _jsii package so that - // importlib.resources will be able to load our assembly from it. - const assemblyInitFilename = path.join(this.getAssemblyOutputDir(assm), "__init__.py"); + public addData(module: Module, filename: string, data: string | null) { + if (!this.data.has(module.name)) { + this.data.set(module.name, new Array()); + } - this.code.openFile(assemblyInitFilename); - this.code.closeFile(assemblyInitFilename); + this.data.get(module.name)!.push({filename, data}); } - protected onEndAssembly(assm: spec.Assembly, _fingerprint: boolean) { - const packageName = toPythonPackageName(assm.name); - const topLevelModuleName = toPythonModuleName(packageName); - const moduleNames = this.modules.map(m => m.name); - const pyTypedFilename = path.join("src", toPythonModuleFilename(topLevelModuleName), "py.typed"); + public write(code: CodeMaker, resolver: TypeResolver) { + const modules = [...this.modules.values()].sort((a, b) => a.name.localeCompare(b.name)); + + // Iterate over all of our modules, and write them out to disk. + for (const mod of modules) { + const filename = path.join("src", pythonModuleNameToFilename(mod.name), "__init__.py"); + + code.openFile(filename); + mod.emit(code, resolver); + code.closeFile(filename); + } - moduleNames.push(`${topLevelModuleName}._jsii`); - moduleNames.sort(); + // Handle our package data. + const packageData: {[key: string]: string[]} = {}; + for (const [mod, pdata] of this.data) { + for (const data of pdata) { + if (data.data != null) { + const filepath = path.join("src", pythonModuleNameToFilename(mod), data.filename); - // We need to write out our packaging for the Python ecosystem here. + code.openFile(filepath); + code.line(data.data); + code.closeFile(filepath); + } + } + + packageData[mod] = pdata.map(pd => pd.filename); + } + + const setupKwargs = { + name: this.name, + version: this.version, + description: this.metadata.summary, + url: this.metadata.url, + package_dir: {"": "src"}, + packages: modules.map(m => m.name), + package_data: packageData, + python_requires: ">=3.6", + install_requires: ["publication"], + }; + + // We Need a setup.py to make this Package, actually a Package. // TODO: // - Author - // - README // - License // - Classifiers - // - install_requires - this.code.openFile("setup.py"); - this.code.line("import setuptools"); - this.code.indent("setuptools.setup("); - this.code.line(`name="${packageName}",`); - this.code.line(`version="${assm.version}",`); - this.code.line(`description="${assm.description}",`); - this.code.line(`url="${assm.homepage}",`); - this.code.line('package_dir={"": "src"},'); - this.code.line(`packages=[${moduleNames.map(m => `"${m}"`).join(",")}],`); - this.code.line(`package_data={"${topLevelModuleName}": ["py.typed"], "${topLevelModuleName}._jsii": ["*.jsii.tgz"]},`); - this.code.line('python_requires=">=3.6",'); - this.code.line(`install_requires=["publication"],`); - this.code.unindent(")"); - this.code.closeFile("setup.py"); + code.openFile("setup.py"); + code.line("import json"); + code.line("import setuptools"); + code.line(); + code.line('kwargs = json.loads("""'); + code.line(JSON.stringify(setupKwargs, null, 4)); + code.line('""")'); + code.line(); + code.line("setuptools.setup(**kwargs)"); + code.closeFile("setup.py"); // Because we're good citizens, we're going to go ahead and support pyproject.toml // as well. // TODO: Might be easier to just use a TOML library to write this out. - this.code.openFile("pyproject.toml"); - this.code.line("[build-system]"); - this.code.line('requires = ["setuptools", "wheel"]'); - this.code.closeFile("pyproject.toml"); + code.openFile("pyproject.toml"); + code.line("[build-system]"); + code.line('requires = ["setuptools", "wheel"]'); + code.closeFile("pyproject.toml"); // We also need to write out a MANIFEST.in to ensure that all of our required // files are included. - this.code.openFile("MANIFEST.in"); - this.code.line("include pyproject.toml"); - this.code.closeFile("MANIFEST.in"); + code.openFile("MANIFEST.in"); + code.line("include pyproject.toml"); + code.closeFile("MANIFEST.in"); + } +} + +interface TypeResolverOpts { + forwardReferences?: boolean; + ignoreOptional?: boolean; +} + +class TypeResolver { + + private readonly types: Map; + private boundTo?: string; + private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.?)+)\.([A-Z].+)$"); - // We also need to write out a py.typed file, to Signal to MyPy that these files - // are safe to use for typechecking. - this.code.openFile(pyTypedFilename); - this.code.closeFile(pyTypedFilename); + constructor(types: Map, boundTo?: string) { + this.types = types; + this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; } - protected onBeginNamespace(ns: string) { - const moduleName = toPythonModuleName(ns); - const loadAssembly = this.assembly.name === ns ? true : false; - const mod = new Module(moduleName, this.assembly, this.getAssemblyFileName(), loadAssembly); + public bind(fqn: string): TypeResolver { + return new TypeResolver(this.types, fqn); + } + + public isInModule(typeRef: spec.NamedTypeReference): boolean { + const pythonType = this.toPythonFQN(typeRef.fqn); + const [, moduleName] = pythonType.match(this.moduleRe) as string[]; + + return this.boundTo !== undefined && this.boundTo === moduleName; + } + + public getType(typeRef: spec.NamedTypeReference): PythonType { + const type = this.types.get(typeRef.fqn); - for (const parentMod of this.moduleStack) { - parentMod.addSubmodule(moduleName); + if (type === undefined) { + throw new Error(`Could not locate type: "${typeRef.fqn}"`); } - this.modules.push(mod); - this.moduleStack.push(mod); + return type; } - protected onEndNamespace(_ns: string) { - const module = this.moduleStack.pop() as Module; - const moduleFilename = path.join("src", toPythonModuleFilename(module.name), "__init__.py"); + public resolve( + typeRef: spec.TypeReference, + opts: TypeResolverOpts = { forwardReferences: true, ignoreOptional: false }): string { + // First, we need to resolve our given type reference into the Python type. + let pythonType = this.toPythonType(typeRef, opts.ignoreOptional); + + // If we split our types by any of the "special" characters that can't appear in + // identifiers (like "[],") then we will get a list of all of the identifiers, + // no matter how nested they are. The downside is we might get trailing/leading + // spaces or empty items so we'll need to trim and filter this list. + const types = pythonType.split(/[\[\],]/).map((s: string) => s.trim()).filter(s => s !== ""); + + for (const innerType of types) { + // Built in types do not need formatted in any particular way. + if (PYTHON_BUILTIN_TYPES.indexOf(innerType) > -1) { + continue; + } + + const [, moduleName, typeName] = innerType.match(this.moduleRe) as string[]; + + // If our resolver is not bound to the same module as the type we're trying to + // resolve, then we'll just skip ahead to the next one, no further changes are + // reqired. + if (this.boundTo === undefined || moduleName !== this.boundTo) { + continue; + } else { + // Otherwise, we have to implement some particular logic in order to deal + // with forward references and trimming our module name out of the type. + // This re will look for the entire type, boxed by either the start/end of + // a string, a comma, a space, a quote, or open/closing brackets. This will + // ensure that we only match whole type names, and not partial ones. + const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); + + // We need to handle forward references, our caller knows if we're able to + // use them in the current context or not, so if not, we'll wrap our forward + // reference in quotes. + if (opts.forwardReferences !== undefined && !opts.forwardReferences) { + pythonType = pythonType.replace(re, `$1"${innerType}"$2`); + } + + // Now that we've gotten forward references out of the way, we will want + // to replace the entire type string, with just the type portion. + pythonType = pythonType.replace(re, `$1${typeName}$2`); + } + } - this.code.openFile(moduleFilename); - module.emit(this.code); - this.code.closeFile(moduleFilename); + return pythonType; } - protected onBeginClass(cls: spec.ClassType, _abstract: boolean | undefined) { - const currentModule = this.currentModule(); + private toPythonType(typeRef: spec.TypeReference, ignoreOptional?: boolean): string { + let pythonType: string; - // TODO: Figure out what to do with abstract here. + // Get the underlying python type. + if (spec.isPrimitiveTypeReference(typeRef)) { + pythonType = this.toPythonPrimitive(typeRef.primitive); + } else if (spec.isCollectionTypeReference(typeRef)) { + pythonType = this.toPythonCollection(typeRef); + } else if (spec.isNamedTypeReference(typeRef)) { + pythonType = this.toPythonFQN(typeRef.fqn); + } else if (typeRef.union) { + const types = new Array(); + for (const subtype of typeRef.union.types) { + types.push(this.toPythonType(subtype)); + } + pythonType = `typing.Union[${types.join(", ")}]`; + } else { + throw new Error("Invalid type reference: " + JSON.stringify(typeRef)); + } - this.currentMember = currentModule.addMember( - new Class( - currentModule.name, - toPythonIdentifier(cls.name), - cls.fqn, - (cls.base !== undefined ? [cls.base] : []).map(b => toPythonType(b)), - ) + // If our type is Optional, then we'll wrap our underlying type with typing.Optional + // However, if we're not respecting optionals, then we'll just skip over this. + if (!ignoreOptional && typeRef.optional) { + pythonType = `typing.Optional[${pythonType}]`; + } + + return pythonType; + } + + private toPythonPrimitive(primitive: spec.PrimitiveType): string { + switch (primitive) { + case spec.PrimitiveType.Boolean: return "bool"; + case spec.PrimitiveType.Date: return "datetime.datetime"; + case spec.PrimitiveType.Json: return "typing.Mapping[typing.Any, typing.Any]"; + case spec.PrimitiveType.Number: return "jsii.Number"; + case spec.PrimitiveType.String: return "str"; + case spec.PrimitiveType.Any: return "typing.Any"; + default: + throw new Error("Unknown primitive type: " + primitive); + } + } + + private toPythonCollection(ref: spec.CollectionTypeReference): string { + const elementPythonType = this.toPythonType(ref.collection.elementtype); + switch (ref.collection.kind) { + case spec.CollectionKind.Array: return `typing.List[${elementPythonType}]`; + case spec.CollectionKind.Map: return `typing.Mapping[str,${elementPythonType}]`; + default: + throw new Error(`Unsupported collection kind: ${ref.collection.kind}`); + } + } + + private toPythonFQN(fqn: string): string { + const [, modulePart, typePart] = fqn.match(/^((?:[^A-Z\.][^\.]+\.?)+)(?:\.([A-Z].+))?$/) as string[]; + const fqnParts: string[] = [toPythonModuleName(modulePart)]; + + if (typePart) { + fqnParts.push(typePart.split(".").map(cur => toPythonIdentifier(cur)).join(".")); + } + + return fqnParts.join("."); + } +} + +class PythonGenerator extends Generator { + + private package: Package; + private types: Map; + + constructor(options = new GeneratorOptions()) { + super(options); + + this.code.openBlockFormatter = s => `${s}:`; + this.code.closeBlockFormatter = _s => ""; + + this.types = new Map(); + } + + protected getAssemblyOutputDir(assm: spec.Assembly) { + return path.join("src", pythonModuleNameToFilename(this.getAssemblyModuleName(assm))); + } + + protected onBeginAssembly(assm: spec.Assembly, _fingerprint: boolean) { + this.package = new Package( + toPythonPackageName(assm.name), + assm.version, + { + summary: assm.description, + readme: assm.readme !== undefined ? assm.readme.markdown : "", + url: assm.homepage, + }, + ); + + const assemblyModule = new Module( + this.getAssemblyModuleName(assm), + null, + { assembly: assm, + assemblyFilename: this.getAssemblyFileName(), + loadAssembly: false }, + ); + + this.package.addModule(assemblyModule); + this.package.addData(assemblyModule, this.getAssemblyFileName(), null); + } + + protected onEndAssembly(_assm: spec.Assembly, _fingerprint: boolean) { + this.package.write(this.code, new TypeResolver(this.types)); + } + + protected onBeginNamespace(ns: string) { + const module = new Module( + toPythonModuleName(ns), + ns, + { assembly: this.assembly, + assemblyFilename: this.getAssemblyFileName(), + loadAssembly: ns === this.assembly.name }, + ); + + this.package.addModule(module); + this.types.set(ns, module); + + // If this is our top level namespace, then we'll want to add a py.typed marker + // so that all of our typing works. + if (ns === this.assembly.name) { + this.package.addData(module, "py.typed", ""); + } + } + + protected onBeginClass(cls: spec.ClassType, _abstract: boolean | undefined) { + // TODO: Figure out what to do with abstract here. + const klass = new Class( + toPythonIdentifier(cls.name), + cls.fqn, + { bases: cls.base !== undefined ? [cls.base] : [] } ); if (cls.initializer !== undefined) { - this.currentMember.addMember( + const { parameters = [] } = cls.initializer; + + klass.addMember( new Initializer( - currentModule.name, - this.currentMember, "__init__", undefined, - cls.initializer.parameters || [], + parameters, cls.initializer.returns, - this.getliftedProp(cls.initializer), + { liftedProp: this.getliftedProp(cls.initializer), parent: cls }, ) ); } - } - protected onEndClass(_cls: spec.ClassType) { - this.currentMember = undefined; + this.addPythonType(klass); } - protected onStaticMethod(_cls: spec.ClassType, method: spec.Method) { - this.currentMember!.addMember( + protected onStaticMethod(cls: spec.ClassType, method: spec.Method) { + const { parameters = [] } = method; + + this.getPythonType(cls.fqn).addMember( new StaticMethod( - this.currentModule().name, - this.currentMember!, toPythonMethodName(method.name!), - method.name!, - method.parameters || [], + method.name, + parameters, method.returns, - this.getliftedProp(method), + { liftedProp: this.getliftedProp(method) }, ) ); } - protected onMethod(_cls: spec.ClassType, method: spec.Method) { - this.currentMember!.addMember( - new Method( - this.currentModule().name, - this.currentMember!, - toPythonMethodName(method.name!), - method.name!, - method.parameters || [], - method.returns, - this.getliftedProp(method), + protected onStaticProperty(cls: spec.ClassType, prop: spec.Property) { + this.getPythonType(cls.fqn).addMember( + new StaticProperty( + toPythonPropertyName(prop.name), + prop.name, + prop.type, + { immutable: prop.immutable }, ) ); } - protected onStaticProperty(_cls: spec.ClassType, prop: spec.Property) { - this.currentMember!.addMember( - new StaticProperty( - this.currentModule().name, - toPythonPropertyName(prop.name!), - prop.name!, - prop.type, - prop.immutable || false + protected onMethod(cls: spec.ClassType, method: spec.Method) { + const { parameters = [] } = method; + + this.getPythonType(cls.fqn).addMember( + new Method( + toPythonMethodName(method.name!), + method.name, + parameters, + method.returns, + { liftedProp: this.getliftedProp(method) }, ) ); } - protected onProperty(_cls: spec.ClassType, prop: spec.Property) { - this.currentMember!.addMember( + protected onProperty(cls: spec.ClassType, prop: spec.Property) { + this.getPythonType(cls.fqn).addMember( new Property( - this.currentModule().name, - toPythonPropertyName(prop.name!), - prop.name!, + toPythonPropertyName(prop.name), + prop.name, prop.type, - prop.immutable || false, + { immutable: prop.immutable }, ) ); } protected onBeginInterface(ifc: spec.InterfaceType) { - const currentModule = this.currentModule(); + let iface: Interface | TypedDict; if (ifc.datatype) { - this.currentMember = currentModule.addMember( - new TypedDict( - currentModule.name, - toPythonIdentifier(ifc.name) - ) + iface = new TypedDict( + toPythonIdentifier(ifc.name), + ifc.fqn, + { bases: ifc.interfaces }, ); } else { - this.currentMember = currentModule.addMember( - new Interface( - currentModule.name, - toPythonIdentifier(ifc.name), - (ifc.interfaces || []).map(i => toPythonType(i)) - ) + iface = new Interface( + toPythonIdentifier(ifc.name), + ifc.fqn, + { bases: ifc.interfaces }, ); } - } - protected onEndInterface(_ifc: spec.InterfaceType) { - this.currentMember = undefined; + this.addPythonType(iface); } + protected onEndInterface(_ifc: spec.InterfaceType) { return; } + protected onInterfaceMethod(ifc: spec.InterfaceType, method: spec.Method) { - if (ifc.datatype) { - throw new Error("Cannot have a method on a data type."); - } + const { parameters = [] } = method; - this.currentMember!.addMember( + this.getPythonType(ifc.fqn).addMember( new InterfaceMethod( - this.currentModule().name, - this.currentMember!, toPythonMethodName(method.name!), - method.name!, - method.parameters || [], + method.name, + parameters, method.returns, - this.getliftedProp(method), + { liftedProp: this.getliftedProp(method) }, ) ); } protected onInterfaceProperty(ifc: spec.InterfaceType, prop: spec.Property) { + let ifaceProperty: InterfaceProperty | TypedDictProperty; + if (ifc.datatype) { - this.currentMember!.addMember( - new TypedDictProperty( - this.currentModule().name, - toPythonIdentifier(prop.name!), - prop.type, - ) + ifaceProperty = new TypedDictProperty( + toPythonIdentifier(prop.name), + prop.type, ); } else { - this.currentMember!.addMember( - new InterfaceProperty( - this.currentModule().name, - toPythonPropertyName(prop.name!), - prop.name!, - prop.type, - true, - ) + ifaceProperty = new InterfaceProperty( + toPythonPropertyName(prop.name), + prop.name, + prop.type, + { immutable: prop.immutable }, ); } - } - - protected onBeginEnum(enm: spec.EnumType) { - const currentModule = this.currentModule(); - const newMember = new Enum(currentModule.name, toPythonIdentifier(enm.name)); - this.currentMember = currentModule.addMember(newMember); + this.getPythonType(ifc.fqn).addMember(ifaceProperty); } - protected onEndEnum(_enm: spec.EnumType) { - this.currentMember = undefined; + protected onBeginEnum(enm: spec.EnumType) { + this.addPythonType(new Enum(toPythonIdentifier(enm.name), enm.fqn, {})); } - protected onEnumMember(_enm: spec.EnumType, member: spec.EnumMember) { - this.currentMember!.addMember( + protected onEnumMember(enm: spec.EnumType, member: spec.EnumMember) { + this.getPythonType(enm.fqn).addMember( new EnumMember( - this.currentModule().name, toPythonIdentifier(member.name), - member.name + member.name, ) ); } - // Not Currently Used - protected onInterfaceMethodOverload(_ifc: spec.InterfaceType, _overload: spec.Method, _originalMethod: spec.Method) { - debug("onInterfaceMethodOverload"); throw new Error("Unhandled Type: InterfaceMethodOverload"); } protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { - debug("onUnionProperty"); throw new Error("Unhandled Type: UnionProperty"); } protected onMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { - debug("onMethodOverload"); throw new Error("Unhandled Type: MethodOverload"); } protected onStaticMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { - debug("onStaticMethodOverload"); throw new Error("Unhandled Type: StaticMethodOverload"); } - // End Not Currently Used + private getAssemblyModuleName(assm: spec.Assembly): string { + return `${toPythonModuleName(assm.name)}._jsii`; + } + + private getParentFQN(fqn: string): string { + const m = fqn.match(/^(.+)\.[^\.]+$/); + + if (m === null) { + throw new Error(`Could not determine parent FQN of: ${fqn}`); + } + + return m[1]; + } + + private getParent(fqn: string): PythonType { + return this.getPythonType(this.getParentFQN(fqn)); + } + + private getPythonType(fqn: string): PythonType { + const type = this.types.get(fqn); + + if (type === undefined) { + throw new Error(`Could not locate type: "${fqn}"`); + } + + return type; + } + + private addPythonType(type: PythonType) { + if (type.fqn === null) { + throw new Error("Cannot add a Python type without a FQN."); + } + + this.getParent(type.fqn).addMember(type); + this.types.set(type.fqn, type); + } private getliftedProp(method: spec.Method): spec.InterfaceType | undefined { // If there are parameters to this method, and if the last parameter's type is @@ -1215,8 +1237,4 @@ class PythonGenerator extends Generator { return undefined; } - - private currentModule(): Module { - return this.moduleStack.slice(-1)[0]; - } } diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index 405130a07c..fc956f1009 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -20,10 +20,8 @@ "aws" ], "dependencies": { - "@types/escape-string-regexp": "^1.0.0", "clone": "^2.1.1", "codemaker": "^0.7.7", - "escape-string-regexp": "^1.0.5", "fs-extra": "^4.0.3", "jsii-spec": "^0.7.7", "spdx-license-list": "^4.1.0", From 366c44b2eb9eacaa5dd9fdcf8137622b01e3cba3 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 24 Oct 2018 16:47:10 -0400 Subject: [PATCH 070/117] Fix a bug with non-builtin but standard types --- packages/jsii-pacmak/lib/targets/python.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8175f7908f..42041684e5 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -819,6 +819,7 @@ class TypeResolver { private readonly types: Map; private boundTo?: string; + private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.?)+)\.([A-Z].+)$"); constructor(types: Map, boundTo?: string) { @@ -865,6 +866,12 @@ class TypeResolver { continue; } + // These are not exactly built in types, but they're also not types that + // this resolver has to worry about. + if (this.stdTypesRe.test(innerType)) { + continue; + } + const [, moduleName, typeName] = innerType.match(this.moduleRe) as string[]; // If our resolver is not bound to the same module as the type we're trying to From 7505b32d61143d3c0edfd213b7ee323f9ac3ca83 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 24 Oct 2018 16:51:14 -0400 Subject: [PATCH 071/117] Make sure that __jsii_assembly__ is in __all__ --- packages/jsii-pacmak/lib/targets/python.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 42041684e5..3c87870343 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -688,7 +688,11 @@ class Module implements PythonType { } // Whatever names we've exported, we'll write out our __all__ that lists them. - code.line(`__all__ = [${this.members.map(m => `"${m.name}"`).sort().join(", ")}]`); + const exportedMembers = this.members.map(m => `"${m.name}"`); + if (this.loadAssembly) { + exportedMembers.push(`"__jsii_assembly__"`); + } + code.line(`__all__ = [${exportedMembers.sort().join(", ")}]`); // Finally, we'll use publication to ensure that all of the non-public names // get hidden from dir(), tab-complete, etc. From 70d15d0746926b3fc252719b1f797d66e54c63bf Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 24 Oct 2018 20:51:47 -0400 Subject: [PATCH 072/117] Deterministic regex --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 3c87870343..055b6bd9f6 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -824,7 +824,7 @@ class TypeResolver { private readonly types: Map; private boundTo?: string; private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); - private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.?)+)\.([A-Z].+)$"); + private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.)*(?:[^A-Z\.][^\.]+))\.([A-Z].+)$"); constructor(types: Map, boundTo?: string) { this.types = types; From e76d4aab1ba205dee5878d9d2f9e339ef0fcdad0 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 10:30:07 -0400 Subject: [PATCH 073/117] Fix support for imports from submodules --- packages/jsii-pacmak/lib/targets/python.ts | 155 +++++++++++++++++---- packages/jsii-pacmak/package.json | 2 + 2 files changed, 133 insertions(+), 24 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 055b6bd9f6..92081243b9 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -2,6 +2,7 @@ import path = require('path'); import util = require('util'); import { CodeMaker, toSnakeCase } from 'codemaker'; +import * as escapeStringRegexp from 'escape-string-regexp'; import * as spec from 'jsii-spec'; import { Generator, GeneratorOptions } from '../generator'; import { Target, TargetOptions } from '../target'; @@ -130,9 +131,29 @@ const sortMembers = (sortable: PythonBase[], resolver: TypeResolver): PythonBase return sorted; }; +const recurseForNamedTypeReferences = (typeRef: spec.TypeReference): spec.NamedTypeReference[] => { + if (spec.isPrimitiveTypeReference(typeRef)) { + return []; + } else if (spec.isCollectionTypeReference(typeRef)) { + return recurseForNamedTypeReferences(typeRef.collection.elementtype); + } else if (spec.isNamedTypeReference(typeRef)) { + return [typeRef]; + } else if (typeRef.union) { + const types: spec.NamedTypeReference[] = []; + for (const type of typeRef.union.types) { + types.push(...recurseForNamedTypeReferences(type)); + } + return types; + } else { + throw new Error("Invalid type reference: " + JSON.stringify(typeRef)); + } +}; + interface PythonBase { readonly name: string; + getTypes(): spec.NamedTypeReference[]; + emit(code: CodeMaker, resolver: TypeResolver): void; } @@ -190,6 +211,14 @@ abstract class BasePythonClassType implements PythonType, ISortableType { return dependencies; } + public getTypes(): spec.NamedTypeReference[] { + const types: spec.NamedTypeReference[] = []; + for (const member of this.members) { + types.push(...member.getTypes()); + } + return types; + } + public addMember(member: PythonBase) { this.members.push(member); } @@ -245,6 +274,22 @@ abstract class BaseMethod implements PythonBase { this.parent = opts.parent; } + public getTypes(): spec.NamedTypeReference[] { + const types: spec.NamedTypeReference[] = []; + + // Look into our parameters and see what we need from there. + for (const parameter of this.parameters) { + types.push(...recurseForNamedTypeReferences(parameter.type)); + } + + // If we return anything, also check it. + if (this.returns !== undefined) { + types.push(...recurseForNamedTypeReferences(this.returns)); + } + + return types; + } + public emit(code: CodeMaker, resolver: TypeResolver) { let returnType: string; if (this.returns !== undefined) { @@ -405,6 +450,10 @@ abstract class BaseProperty implements PythonBase { this.immutable = immutable; } + public getTypes(): spec.NamedTypeReference[] { + return recurseForNamedTypeReferences(this.type); + } + public emit(code: CodeMaker, resolver: TypeResolver) { const pythonType = resolver.resolve(this.type, { forwardReferences: false }); @@ -535,6 +584,10 @@ class TypedDictProperty implements PythonBase { return this.type.optional !== undefined ? this.type.optional : false; } + public getTypes(): spec.NamedTypeReference[] { + return recurseForNamedTypeReferences(this.type); + } + public emit(code: CodeMaker, resolver: TypeResolver) { const resolvedType = resolver.resolve( this.type, @@ -608,6 +661,10 @@ class EnumMember implements PythonBase { this.value = value; } + public getTypes(): spec.NamedTypeReference[] { + return []; + } + public emit(code: CodeMaker, _resolver: TypeResolver) { code.line(`${this.name} = "${this.value}"`); } @@ -643,6 +700,14 @@ class Module implements PythonType { this.members.push(member); } + public getTypes(): spec.NamedTypeReference[] { + const types: spec.NamedTypeReference[] = []; + for (const member of this.members) { + types.push(...member.getTypes()); + } + return types; + } + public emit(code: CodeMaker, resolver: TypeResolver) { resolver = this.fqn ? resolver.bind(this.fqn) : resolver; @@ -659,17 +724,7 @@ class Module implements PythonType { code.line("from jsii.python import classproperty"); // Go over all of the modules that we need to import, and import them. - // for (let [idx, modName] of this.importedModules.sort().entries()) { - const dependencies = Object.keys(this.assembly.dependencies || {}); - for (const [idx, depName] of dependencies.sort().entries()) { - // If this our first dependency, add a blank line to format our imports - // slightly nicer. - if (idx === 0) { - code.line(); - } - - code.line(`import ${toPythonModuleName(depName)}`); - } + this.emitDependencyImports(code, resolver); // Determine if we need to write out the kernel load line. if (this.loadAssembly) { @@ -699,6 +754,40 @@ class Module implements PythonType { code.line(); code.line("publication.publish()"); } + + private emitDependencyImports(code: CodeMaker, resolver: TypeResolver) { + const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.(.+)$`); + const deps = Array.from( + new Set([ + ...Object.keys(this.assembly.dependencies || {}).map(d => toPythonModuleName(d)), + ...resolver.requiredModules(this.getTypes()), + ]) + ); + + // Only emit dependencies that are *not* submodules to our current module. + for (const [idx, moduleName] of deps.filter(d => !moduleRe.test(d)).sort().entries()) { + // If this our first dependency, add a blank line to format our imports + // slightly nicer. + if (idx === 0) { + code.line(); + } + + code.line(`import ${moduleName}`); + } + + // Only emit dependencies that *are* submodules to our current module. + for (const [idx, moduleName] of deps.filter(d => moduleRe.test(d)).sort().entries()) { + // If this our first dependency, add a blank line to format our imports + // slightly nicer. + if (idx === 0) { + code.line(); + } + + const [, submoduleName] = moduleName.match(moduleRe) as string[]; + + code.line(`from . import ${submoduleName}`); + } + } } interface PackageMetadata { @@ -824,19 +913,24 @@ class TypeResolver { private readonly types: Map; private boundTo?: string; private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); + private readonly boundRe: RegExp; private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.)*(?:[^A-Z\.][^\.]+))\.([A-Z].+)$"); constructor(types: Map, boundTo?: string) { this.types = types; this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; + + if (this.boundTo !== undefined) { + this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\.(.+)$`); + } } public bind(fqn: string): TypeResolver { return new TypeResolver(this.types, fqn); } - public isInModule(typeRef: spec.NamedTypeReference): boolean { - const pythonType = this.toPythonFQN(typeRef.fqn); + public isInModule(typeRef: spec.NamedTypeReference | string): boolean { + const pythonType = typeof typeRef !== "string" ? this.toPythonFQN(typeRef.fqn) : typeRef; const [, moduleName] = pythonType.match(this.moduleRe) as string[]; return this.boundTo !== undefined && this.boundTo === moduleName; @@ -852,9 +946,24 @@ class TypeResolver { return type; } + public requiredModules(types: spec.NamedTypeReference[]): Set { + const modules = new Set(); + for (const type of types.map(t => this.toPythonType(t, true))) { + if (!this.isInModule(type)) { + const [, moduleName] = type.match(this.moduleRe) as string[]; + modules.add(moduleName); + } + } + return modules; + } + public resolve( typeRef: spec.TypeReference, opts: TypeResolverOpts = { forwardReferences: true, ignoreOptional: false }): string { + const { + forwardReferences = true, + } = opts; + // First, we need to resolve our given type reference into the Python type. let pythonType = this.toPythonType(typeRef, opts.ignoreOptional); @@ -876,25 +985,23 @@ class TypeResolver { continue; } - const [, moduleName, typeName] = innerType.match(this.moduleRe) as string[]; - - // If our resolver is not bound to the same module as the type we're trying to - // resolve, then we'll just skip ahead to the next one, no further changes are - // reqired. - if (this.boundTo === undefined || moduleName !== this.boundTo) { - continue; - } else { - // Otherwise, we have to implement some particular logic in order to deal - // with forward references and trimming our module name out of the type. + // If our resolver is bound to the same module as the type we're trying to + // resolve, then we'll implement the needed logic to use module relative naming + // and to handle forward references (if needed). + if (this.boundRe !== undefined && this.boundRe.test(innerType)) { // This re will look for the entire type, boxed by either the start/end of // a string, a comma, a space, a quote, or open/closing brackets. This will // ensure that we only match whole type names, and not partial ones. const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); + const [, , typeName] = innerType.match(this.boundRe) as string[]; // We need to handle forward references, our caller knows if we're able to // use them in the current context or not, so if not, we'll wrap our forward // reference in quotes. - if (opts.forwardReferences !== undefined && !opts.forwardReferences) { + // We have special logic here for checking if our thing is actually *in* + // our module, behond what we've already done, because our other logic will + // work for submodules, but this can't. + if (!forwardReferences && this.isInModule(innerType)) { pythonType = pythonType.replace(re, `$1"${innerType}"$2`); } diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index fc956f1009..6c7a127402 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -22,6 +22,7 @@ "dependencies": { "clone": "^2.1.1", "codemaker": "^0.7.7", + "escape-string-regexp": "^1.0.5", "fs-extra": "^4.0.3", "jsii-spec": "^0.7.7", "spdx-license-list": "^4.1.0", @@ -31,6 +32,7 @@ "devDependencies": { "@scope/jsii-calc-lib": "^0.7.7", "@types/clone": "^0.1.30", + "@types/escape-string-regexp": "^1.0.0", "@types/fs-extra": "^4.0.8", "@types/node": "^9.6.18", "@types/nodeunit": "0.0.30", From 1288b032842e19cb8bd5db5cb7596c098842598e Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 10:31:01 -0400 Subject: [PATCH 074/117] Correctly pass in the klass argument to @classproperty properties --- packages/jsii-python-runtime/src/jsii/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/python.py b/packages/jsii-python-runtime/src/jsii/python.py index 406e738ca6..d8d2d5396f 100644 --- a/packages/jsii-python-runtime/src/jsii/python.py +++ b/packages/jsii-python-runtime/src/jsii/python.py @@ -6,7 +6,7 @@ def __init__(self, fget, fset=None): def __get__(self, obj, klass=None): if klass is None: klass = type(obj) - return self.fget.__get__(obj, klass)() + return self.fget.__get__(obj, klass)(klass) def __set__(self, obj, value): if not self.fset: From efcded0ab24159d7ed5f77b28272465a28b4072c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 10:45:01 -0400 Subject: [PATCH 075/117] Emit a None default for optional positional params --- packages/jsii-pacmak/lib/targets/python.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 92081243b9..6561897480 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -305,8 +305,9 @@ abstract class BaseMethod implements PythonBase { for (const param of this.parameters) { const paramName = toPythonIdentifier(param.name); const paramType = resolver.resolve(param.type, { forwardReferences: false}); + const paramDefault = param.type.optional ? "=None" : ""; - pythonParams.push(`${paramName}: ${paramType}`); + pythonParams.push(`${paramName}: ${paramType}${paramDefault}`); } // If we have a lifted parameter, then we'll drop the last argument to our params From 7e7bbc712a8c60ebc6b7a8f6f4e3a3cfa406dec8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 10:51:40 -0400 Subject: [PATCH 076/117] Don't add typing.Optional to the auto props expansion --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 6561897480..c5352ac07d 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -371,7 +371,7 @@ abstract class BaseMethod implements PythonBase { private emitAutoProps(code: CodeMaker, resolver: TypeResolver) { const lastParameter = this.parameters.slice(-1)[0]; const argName = toPythonIdentifier(lastParameter.name); - const typeName = resolver.resolve(lastParameter.type); + const typeName = resolver.resolve(lastParameter.type, {ignoreOptional: true }); // We need to build up a list of properties, which are mandatory, these are the // ones we will specifiy to start with in our dictionary literal. From 6a2ec914b23acb6ef87f5bbbf1e457ef0a96ec01 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 11:14:37 -0400 Subject: [PATCH 077/117] Use "real" forward refs if possible, even with forwardReferences = false --- packages/jsii-pacmak/lib/targets/python.ts | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index c5352ac07d..86db155ff3 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -165,6 +165,10 @@ interface PythonType extends PythonBase { addMember(member: PythonBase): void; } +function isPythonType(arg: PythonBase): arg is PythonType { + return (arg as any).fqn !== undefined; +} + interface ISortableType { dependsOn(resolver: TypeResolver): spec.NamedTypeReference[]; } @@ -229,6 +233,10 @@ abstract class BasePythonClassType implements PythonType, ISortableType { if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); + + if (isPythonType(member)) { + resolver.markTypeEmitted(member); + } } } else { code.line("pass"); @@ -528,6 +536,10 @@ class TypedDict extends BasePythonClassType { code.openBlock(`class _${this.name}(${classParams.concat(["total=False"]).join(", ")})`); for (const member of optionalMembers) { member.emit(code, resolver); + + if (isPythonType(member)) { + resolver.markTypeEmitted(member); + } } code.closeBlock(); @@ -535,6 +547,10 @@ class TypedDict extends BasePythonClassType { code.openBlock(`class ${this.name}(_${this.name})`); for (const member of sortMembers(mandatoryMembers, resolver)) { member.emit(code, resolver); + + if (isPythonType(member)) { + resolver.markTypeEmitted(member); + } } code.closeBlock(); } else { @@ -551,6 +567,10 @@ class TypedDict extends BasePythonClassType { if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); + + if (isPythonType(member)) { + resolver.markTypeEmitted(member); + } } } else { code.line("pass"); @@ -741,6 +761,10 @@ class Module implements PythonType { // Emit all of our members. for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); + + if (isPythonType(member)) { + resolver.markTypeEmitted(member); + } } // Whatever names we've exported, we'll write out our __all__ that lists them. @@ -916,10 +940,12 @@ class TypeResolver { private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); private readonly boundRe: RegExp; private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.)*(?:[^A-Z\.][^\.]+))\.([A-Z].+)$"); + private readonly emitted: Set; constructor(types: Map, boundTo?: string) { this.types = types; this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; + this.emitted = new Set(); if (this.boundTo !== undefined) { this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\.(.+)$`); @@ -958,6 +984,12 @@ class TypeResolver { return modules; } + public markTypeEmitted(type: PythonType) { + if (type.fqn) { + this.emitted.add(this.toPythonFQN(type.fqn)); + } + } + public resolve( typeRef: spec.TypeReference, opts: TypeResolverOpts = { forwardReferences: true, ignoreOptional: false }): string { @@ -1002,7 +1034,7 @@ class TypeResolver { // We have special logic here for checking if our thing is actually *in* // our module, behond what we've already done, because our other logic will // work for submodules, but this can't. - if (!forwardReferences && this.isInModule(innerType)) { + if (!forwardReferences && this.isInModule(innerType) && !this.emitted.has(innerType)) { pythonType = pythonType.replace(re, `$1"${innerType}"$2`); } From 22d2a34420a9a97b5c7d03ed5658776e5ae47afa Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 25 Oct 2018 12:13:14 -0400 Subject: [PATCH 078/117] Implement Abstract classes --- packages/jsii-pacmak/lib/targets/python.ts | 56 +++++++++++++++---- .../jsii-python-runtime/src/jsii/__init__.py | 3 +- .../jsii-python-runtime/src/jsii/_runtime.py | 5 ++ 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 86db155ff3..2e347b18c3 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -249,6 +249,7 @@ abstract class BasePythonClassType implements PythonType, ISortableType { } interface BaseMethodOpts { + abstract?: boolean; liftedProp?: spec.InterfaceType, parent?: spec.NamedTypeReference, } @@ -268,18 +269,22 @@ abstract class BaseMethod implements PythonBase { private readonly returns?: spec.TypeReference; private readonly liftedProp?: spec.InterfaceType; private readonly parent?: spec.NamedTypeReference; + private readonly abstract: boolean; constructor(name: string, jsName: string | undefined, parameters: spec.Parameter[], returns?: spec.TypeReference, opts: BaseMethodOpts = {}) { + const { abstract = false } = opts; + this.name = name; this.jsName = jsName; this.parameters = parameters; this.returns = returns; this.liftedProp = opts.liftedProp; this.parent = opts.parent; + this.abstract = abstract; } public getTypes(): spec.NamedTypeReference[] { @@ -359,13 +364,17 @@ abstract class BaseMethod implements PythonBase { code.line(`@${this.decorator}`); } + if (this.abstract) { + code.line("@abc.abstractmethod"); + } + code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${returnType}`); this.emitBody(code, resolver); code.closeBlock(); } private emitBody(code: CodeMaker, resolver: TypeResolver) { - if (this.jsiiMethod === undefined) { + if (this.jsiiMethod === undefined || this.abstract) { code.line("..."); } else { if (this.liftedProp !== undefined) { @@ -432,6 +441,7 @@ abstract class BaseMethod implements PythonBase { } interface BasePropertyOpts { + abstract?: boolean; immutable?: boolean; } @@ -446,16 +456,19 @@ abstract class BaseProperty implements PythonBase { private readonly jsName: string; private readonly type: spec.TypeReference; + private readonly abstract: boolean; private readonly immutable: boolean; constructor(name: string, jsName: string, type: spec.TypeReference, opts: BasePropertyOpts = {}) { const { + abstract = false, immutable = false, } = opts; this.name = name; this.jsName = jsName; this.type = type; + this.abstract = abstract; this.immutable = immutable; } @@ -467,8 +480,11 @@ abstract class BaseProperty implements PythonBase { const pythonType = resolver.resolve(this.type, { forwardReferences: false }); code.line(`@${this.decorator}`); + if (this.abstract) { + code.line("@abc.abstractmethod"); + } code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${pythonType}`); - if (this.jsiiGetMethod !== undefined) { + if (this.jsiiGetMethod !== undefined && !this.abstract) { code.line(`return jsii.${this.jsiiGetMethod}(${this.implicitParameter}, "${this.jsName}")`); } else { code.line("..."); @@ -477,8 +493,11 @@ abstract class BaseProperty implements PythonBase { if (!this.immutable) { code.line(`@${this.name}.setter`); + if (this.abstract) { + code.line("@abc.abstractmethod"); + } code.openBlock(`def ${this.name}(${this.implicitParameter}, value: ${pythonType})`); - if (this.jsiiSetMethod !== undefined) { + if (this.jsiiSetMethod !== undefined && !this.abstract) { code.line(`return jsii.${this.jsiiSetMethod}(${this.implicitParameter}, "${this.jsName}", value)`); } else { code.line("..."); @@ -618,12 +637,27 @@ class TypedDictProperty implements PythonBase { } } +interface ClassOpts extends PythonTypeOpts { + abstract?: boolean; +} + class Class extends BasePythonClassType { + private abstract: boolean; + + constructor(name: string, fqn: string, opts: ClassOpts) { + super(name, fqn, opts); + + const { abstract = false } = opts; + + this.abstract = abstract; + } + protected getClassParams(resolver: TypeResolver): string[] { const params: string[] = this.bases.map(b => resolver.resolve(b)); + const metaclass: string = this.abstract ? "JSIIAbstractClass" : "JSIIMeta"; - params.push("metaclass=jsii.JSIIMeta"); + params.push(`metaclass=jsii.${metaclass}`); params.push(`jsii_type="${this.fqn}"`); return params; @@ -734,6 +768,7 @@ class Module implements PythonType { // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. + code.line("import abc"); code.line("import datetime"); code.line("import enum"); code.line("import typing"); @@ -1175,12 +1210,11 @@ class PythonGenerator extends Generator { } } - protected onBeginClass(cls: spec.ClassType, _abstract: boolean | undefined) { - // TODO: Figure out what to do with abstract here. + protected onBeginClass(cls: spec.ClassType, abstract: boolean | undefined) { const klass = new Class( toPythonIdentifier(cls.name), cls.fqn, - { bases: cls.base !== undefined ? [cls.base] : [] } + { abstract, bases: cls.base !== undefined ? [cls.base] : [] } ); if (cls.initializer !== undefined) { @@ -1209,7 +1243,7 @@ class PythonGenerator extends Generator { method.name, parameters, method.returns, - { liftedProp: this.getliftedProp(method) }, + { abstract: method.abstract, liftedProp: this.getliftedProp(method) }, ) ); } @@ -1220,7 +1254,7 @@ class PythonGenerator extends Generator { toPythonPropertyName(prop.name), prop.name, prop.type, - { immutable: prop.immutable }, + { abstract: prop.abstract, immutable: prop.immutable }, ) ); } @@ -1234,7 +1268,7 @@ class PythonGenerator extends Generator { method.name, parameters, method.returns, - { liftedProp: this.getliftedProp(method) }, + { abstract: method.abstract, liftedProp: this.getliftedProp(method) }, ) ); } @@ -1245,7 +1279,7 @@ class PythonGenerator extends Generator { toPythonPropertyName(prop.name), prop.name, prop.type, - { immutable: prop.immutable }, + { abstract: prop.abstract, immutable: prop.immutable }, ) ); } diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index db2c4a9a37..7a976e4fb3 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,6 +1,6 @@ from typing import Union -from ._runtime import JSIIAssembly, JSIIMeta, kernel +from ._runtime import JSIIAssembly, JSIIMeta, JSIIAbstractClass, kernel # JS doesn't have distinct float or integer types, but we do. So we'll define our own @@ -25,6 +25,7 @@ __all__ = [ "JSIIAssembly", "JSIIMeta", + "JSIIAbstractClass", "Number", "load", "create", diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index aa044144e2..9b3a4cecd2 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -1,3 +1,4 @@ +import abc import weakref import os @@ -76,3 +77,7 @@ def __call__(cls, *args, **kwargs): weakref.finalize(inst, kernel.delete, inst.__jsii_ref__) return inst + + +class JSIIAbstractClass(abc.ABCMeta, JSIIMeta): + pass From 2987f3633180bb8bef803e1158443613212747f6 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 26 Oct 2018 11:55:37 -0400 Subject: [PATCH 079/117] Don't trust whether the JSII tells us a parameter is optional or not --- packages/jsii-pacmak/lib/targets/python.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 2e347b18c3..4805003008 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -311,14 +311,28 @@ abstract class BaseMethod implements PythonBase { returnType = "None"; } + // We cannot (currently?) trust the JSII to accurately tell us whether a + // parameter is truly optional or not. Because of that, we have to selectively + // choose when we're going to respect the optional flag and emit a default value + // to only be at the tail end of the method signature. + // See: https://github.com/awslabs/jsii/issues/284 + let optionalStartsAt: number | undefined; + for (const [idx, param] of this.parameters.entries()) { + if (param.type.optional && optionalStartsAt === undefined) { + optionalStartsAt = idx; + } else if (!param.type.optional) { + optionalStartsAt = undefined; + } + } + // We need to turn a list of JSII parameters, into Python style arguments with // gradual typing, so we'll have to iterate over the list of parameters, and // build the list, converting as we go. const pythonParams: string[] = [this.implicitParameter]; - for (const param of this.parameters) { + for (const [idx, param] of this.parameters.entries()) { const paramName = toPythonIdentifier(param.name); const paramType = resolver.resolve(param.type, { forwardReferences: false}); - const paramDefault = param.type.optional ? "=None" : ""; + const paramDefault = optionalStartsAt !== undefined && idx >= optionalStartsAt ? "=None" : ""; pythonParams.push(`${paramName}: ${paramType}${paramDefault}`); } From 72fb08dca6631fa3ccd9fe7978aa10d5144bae6b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 26 Oct 2018 12:09:30 -0400 Subject: [PATCH 080/117] Don't include Optional when emitting Any --- packages/jsii-pacmak/lib/targets/python.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 4805003008..7a91bccc28 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1118,7 +1118,10 @@ class TypeResolver { // If our type is Optional, then we'll wrap our underlying type with typing.Optional // However, if we're not respecting optionals, then we'll just skip over this. - if (!ignoreOptional && typeRef.optional) { + // We explicitly don't emit this when our type is typing.Any, because typing.Any + // already implied that None is an accepted type. + // See: https://github.com/awslabs/jsii/issues/284 + if (!ignoreOptional && typeRef.optional && pythonType !== "typing.Any") { pythonType = `typing.Optional[${pythonType}]`; } From 785ce86e4dd14e11a82801815c820d738cdea6bb Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 26 Oct 2018 14:37:33 -0400 Subject: [PATCH 081/117] Revert "Use "real" forward refs if possible, even with forwardReferences = false" This reverts commit 6a2ec914b23acb6ef87f5bbbf1e457ef0a96ec01. --- packages/jsii-pacmak/lib/targets/python.ts | 34 +--------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 7a91bccc28..6ee62f073d 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -165,10 +165,6 @@ interface PythonType extends PythonBase { addMember(member: PythonBase): void; } -function isPythonType(arg: PythonBase): arg is PythonType { - return (arg as any).fqn !== undefined; -} - interface ISortableType { dependsOn(resolver: TypeResolver): spec.NamedTypeReference[]; } @@ -233,10 +229,6 @@ abstract class BasePythonClassType implements PythonType, ISortableType { if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); - - if (isPythonType(member)) { - resolver.markTypeEmitted(member); - } } } else { code.line("pass"); @@ -569,10 +561,6 @@ class TypedDict extends BasePythonClassType { code.openBlock(`class _${this.name}(${classParams.concat(["total=False"]).join(", ")})`); for (const member of optionalMembers) { member.emit(code, resolver); - - if (isPythonType(member)) { - resolver.markTypeEmitted(member); - } } code.closeBlock(); @@ -580,10 +568,6 @@ class TypedDict extends BasePythonClassType { code.openBlock(`class ${this.name}(_${this.name})`); for (const member of sortMembers(mandatoryMembers, resolver)) { member.emit(code, resolver); - - if (isPythonType(member)) { - resolver.markTypeEmitted(member); - } } code.closeBlock(); } else { @@ -600,10 +584,6 @@ class TypedDict extends BasePythonClassType { if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); - - if (isPythonType(member)) { - resolver.markTypeEmitted(member); - } } } else { code.line("pass"); @@ -810,10 +790,6 @@ class Module implements PythonType { // Emit all of our members. for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); - - if (isPythonType(member)) { - resolver.markTypeEmitted(member); - } } // Whatever names we've exported, we'll write out our __all__ that lists them. @@ -989,12 +965,10 @@ class TypeResolver { private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); private readonly boundRe: RegExp; private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.)*(?:[^A-Z\.][^\.]+))\.([A-Z].+)$"); - private readonly emitted: Set; constructor(types: Map, boundTo?: string) { this.types = types; this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; - this.emitted = new Set(); if (this.boundTo !== undefined) { this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\.(.+)$`); @@ -1033,12 +1007,6 @@ class TypeResolver { return modules; } - public markTypeEmitted(type: PythonType) { - if (type.fqn) { - this.emitted.add(this.toPythonFQN(type.fqn)); - } - } - public resolve( typeRef: spec.TypeReference, opts: TypeResolverOpts = { forwardReferences: true, ignoreOptional: false }): string { @@ -1083,7 +1051,7 @@ class TypeResolver { // We have special logic here for checking if our thing is actually *in* // our module, behond what we've already done, because our other logic will // work for submodules, but this can't. - if (!forwardReferences && this.isInModule(innerType) && !this.emitted.has(innerType)) { + if (!forwardReferences && this.isInModule(innerType)) { pythonType = pythonType.replace(re, `$1"${innerType}"$2`); } From 413ec40eeb40c1f4b58d2b1c13b22a947559d093 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 26 Oct 2018 16:55:21 -0400 Subject: [PATCH 082/117] Ensure all of regexp strings are correctly escaped --- packages/jsii-pacmak/lib/targets/python.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 6ee62f073d..841474ab9c 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -806,7 +806,7 @@ class Module implements PythonType { } private emitDependencyImports(code: CodeMaker, resolver: TypeResolver) { - const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\.(.+)$`); + const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\\.(.+)$`); const deps = Array.from( new Set([ ...Object.keys(this.assembly.dependencies || {}).map(d => toPythonModuleName(d)), @@ -962,16 +962,16 @@ class TypeResolver { private readonly types: Map; private boundTo?: string; - private readonly stdTypesRe = new RegExp("^(datetime\.datetime|typing\.[A-Z][a-z]+|jsii\.Number)$"); + private readonly stdTypesRe = new RegExp("^(datetime\\.datetime|typing\\.[A-Z][a-z]+|jsii\\.Number)$"); private readonly boundRe: RegExp; - private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\.]+\.)*(?:[^A-Z\.][^\.]+))\.([A-Z].+)$"); + private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\\.]+\\.)*(?:[^A-Z\\.][^\\.]+))\\.([A-Z].+)$"); constructor(types: Map, boundTo?: string) { this.types = types; this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; if (this.boundTo !== undefined) { - this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\.(.+)$`); + this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\\.(.+)$`); } } From db2e266d90ee6d6c103f8c76b02dd46f79ecc1c8 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 1 Nov 2018 18:26:38 -0400 Subject: [PATCH 083/117] Move Namespaces as classes instead of modules --- packages/jsii-pacmak/lib/targets/python.ts | 217 +++++++++++---------- 1 file changed, 111 insertions(+), 106 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 841474ab9c..55d63e0b76 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -111,7 +111,7 @@ const sortMembers = (sortable: PythonBase[], resolver: TypeResolver): PythonBase // dependencies that we haven't already sorted. while (sortable.length > 0) { for (const item of (sortable as Array)) { - const itemDeps: Set = new Set(item.dependsOn(resolver).map(i => resolver.getType(i))); + const itemDeps: Set = new Set(item.dependsOn(resolver)); if (setDifference(itemDeps, seen).size === 0) { sorted.push(item); seen.add(item); @@ -121,8 +121,8 @@ const sortMembers = (sortable: PythonBase[], resolver: TypeResolver): PythonBase } const leftover = sortable.filter(i => !seen.has(i)); - if (leftover === sortable) { - throw new Error("Could not sort members."); + if (leftover.length === sortable.length) { + throw new Error("Could not sort members (circular dependency?)."); } else { sortable = leftover; } @@ -152,8 +152,6 @@ const recurseForNamedTypeReferences = (typeRef: spec.TypeReference): spec.NamedT interface PythonBase { readonly name: string; - getTypes(): spec.NamedTypeReference[]; - emit(code: CodeMaker, resolver: TypeResolver): void; } @@ -166,7 +164,7 @@ interface PythonType extends PythonBase { } interface ISortableType { - dependsOn(resolver: TypeResolver): spec.NamedTypeReference[]; + dependsOn(resolver: TypeResolver): PythonType[]; } function isSortableType(arg: any): arg is ISortableType { @@ -196,14 +194,32 @@ abstract class BasePythonClassType implements PythonType, ISortableType { this.members = []; } - public dependsOn(resolver: TypeResolver): spec.NamedTypeReference[] { - const dependencies: spec.NamedTypeReference[] = []; + public dependsOn(resolver: TypeResolver): PythonType[] { + const dependencies: PythonType[] = []; + const parent = resolver.getParent(this.fqn!); - // We need to return any bases that are in the same module. + // We need to return any bases that are in the same module at the same level of + // nesting. + const seen: Set = new Set(); for (const base of this.bases) { if (spec.isNamedTypeReference(base)) { if (resolver.isInModule(base)) { - dependencies.push(base); + // Given a base, we need to locate the base's parent that is the same as + // our parent, because we only care about dependencies that are at the + // same level of our own. + // TODO: We might need to recurse into our members to also find their + // dependencies. + let baseItem = resolver.getType(base); + let baseParent = resolver.getParent(base); + while (baseParent !== parent) { + baseItem = baseParent; + baseParent = resolver.getParent(baseItem.fqn!); + } + + if (!seen.has(baseItem.fqn!)) { + dependencies.push(baseItem); + seen.add(baseItem.fqn!); + } } } } @@ -211,20 +227,17 @@ abstract class BasePythonClassType implements PythonType, ISortableType { return dependencies; } - public getTypes(): spec.NamedTypeReference[] { - const types: spec.NamedTypeReference[] = []; - for (const member of this.members) { - types.push(...member.getTypes()); - } - return types; - } - public addMember(member: PythonBase) { this.members.push(member); } public emit(code: CodeMaker, resolver: TypeResolver) { - code.openBlock(`class ${this.name}(${this.getClassParams(resolver).join(", ")})`); + resolver = this.fqn ? resolver.bind(this.fqn) : resolver; + + const classParams = this.getClassParams(resolver); + const bases = classParams.length > 0 ? `(${classParams.join(", ")})` : ""; + + code.openBlock(`class ${this.name}${bases}`); if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { @@ -279,22 +292,6 @@ abstract class BaseMethod implements PythonBase { this.abstract = abstract; } - public getTypes(): spec.NamedTypeReference[] { - const types: spec.NamedTypeReference[] = []; - - // Look into our parameters and see what we need from there. - for (const parameter of this.parameters) { - types.push(...recurseForNamedTypeReferences(parameter.type)); - } - - // If we return anything, also check it. - if (this.returns !== undefined) { - types.push(...recurseForNamedTypeReferences(this.returns)); - } - - return types; - } - public emit(code: CodeMaker, resolver: TypeResolver) { let returnType: string; if (this.returns !== undefined) { @@ -478,10 +475,6 @@ abstract class BaseProperty implements PythonBase { this.immutable = immutable; } - public getTypes(): spec.NamedTypeReference[] { - return recurseForNamedTypeReferences(this.type); - } - public emit(code: CodeMaker, resolver: TypeResolver) { const pythonType = resolver.resolve(this.type, { forwardReferences: false }); @@ -537,6 +530,8 @@ class InterfaceProperty extends BaseProperty { class TypedDict extends BasePythonClassType { public emit(code: CodeMaker, resolver: TypeResolver) { + resolver = this.fqn ? resolver.bind(this.fqn) : resolver; + // MyPy doesn't let us mark some keys as optional, and some keys as mandatory, // we can either mark either the entire class as mandatory or the entire class // as optional. However, we can make two classes, one with all mandatory keys @@ -618,10 +613,6 @@ class TypedDictProperty implements PythonBase { return this.type.optional !== undefined ? this.type.optional : false; } - public getTypes(): spec.NamedTypeReference[] { - return recurseForNamedTypeReferences(this.type); - } - public emit(code: CodeMaker, resolver: TypeResolver) { const resolvedType = resolver.resolve( this.type, @@ -710,15 +701,17 @@ class EnumMember implements PythonBase { this.value = value; } - public getTypes(): spec.NamedTypeReference[] { - return []; - } - public emit(code: CodeMaker, _resolver: TypeResolver) { code.line(`${this.name} = "${this.value}"`); } } +class Namespace extends BasePythonClassType { + protected getClassParams(_resolver: TypeResolver): string[] { + return []; + } +} + interface ModuleOpts { assembly: spec.Assembly, assemblyFilename: string; @@ -749,16 +742,8 @@ class Module implements PythonType { this.members.push(member); } - public getTypes(): spec.NamedTypeReference[] { - const types: spec.NamedTypeReference[] = []; - for (const member of this.members) { - types.push(...member.getTypes()); - } - return types; - } - public emit(code: CodeMaker, resolver: TypeResolver) { - resolver = this.fqn ? resolver.bind(this.fqn) : resolver; + resolver = this.fqn ? resolver.bind(this.fqn, this.name) : resolver; // Before we write anything else, we need to write out our module headers, this // is where we handle stuff like imports, any required initialization, etc. @@ -805,17 +790,14 @@ class Module implements PythonType { code.line("publication.publish()"); } - private emitDependencyImports(code: CodeMaker, resolver: TypeResolver) { - const moduleRe = new RegExp(`^${escapeStringRegexp(this.name)}\\.(.+)$`); + private emitDependencyImports(code: CodeMaker, _resolver: TypeResolver) { const deps = Array.from( new Set([ ...Object.keys(this.assembly.dependencies || {}).map(d => toPythonModuleName(d)), - ...resolver.requiredModules(this.getTypes()), ]) ); - // Only emit dependencies that are *not* submodules to our current module. - for (const [idx, moduleName] of deps.filter(d => !moduleRe.test(d)).sort().entries()) { + for (const [idx, moduleName] of deps.sort().entries()) { // If this our first dependency, add a blank line to format our imports // slightly nicer. if (idx === 0) { @@ -824,19 +806,6 @@ class Module implements PythonType { code.line(`import ${moduleName}`); } - - // Only emit dependencies that *are* submodules to our current module. - for (const [idx, moduleName] of deps.filter(d => moduleRe.test(d)).sort().entries()) { - // If this our first dependency, add a blank line to format our imports - // slightly nicer. - if (idx === 0) { - code.line(); - } - - const [, submoduleName] = moduleName.match(moduleRe) as string[]; - - code.line(`from . import ${submoduleName}`); - } } } @@ -964,26 +933,51 @@ class TypeResolver { private boundTo?: string; private readonly stdTypesRe = new RegExp("^(datetime\\.datetime|typing\\.[A-Z][a-z]+|jsii\\.Number)$"); private readonly boundRe: RegExp; - private readonly moduleRe = new RegExp("^((?:[^A-Z\.][^\\.]+\\.)*(?:[^A-Z\\.][^\\.]+))\\.([A-Z].+)$"); + private readonly moduleName?: string; + private readonly moduleRe: RegExp; - constructor(types: Map, boundTo?: string) { + constructor(types: Map, boundTo?: string, moduleName?: string) { this.types = types; + this.moduleName = moduleName; this.boundTo = boundTo !== undefined ? this.toPythonFQN(boundTo) : boundTo; + if (this.moduleName !== undefined) { + this.moduleRe = new RegExp(`^(${escapeStringRegexp(this.moduleName)})\\.(.+)$`); + } + if (this.boundTo !== undefined) { this.boundRe = new RegExp(`^(${escapeStringRegexp(this.boundTo)})\\.(.+)$`); } } - public bind(fqn: string): TypeResolver { - return new TypeResolver(this.types, fqn); + public bind(fqn: string, moduleName?: string): TypeResolver { + return new TypeResolver( + this.types, + fqn, + moduleName !== undefined ? moduleName : this.moduleName, + ); } public isInModule(typeRef: spec.NamedTypeReference | string): boolean { const pythonType = typeof typeRef !== "string" ? this.toPythonFQN(typeRef.fqn) : typeRef; - const [, moduleName] = pythonType.match(this.moduleRe) as string[]; + return this.moduleRe.test(pythonType); + } - return this.boundTo !== undefined && this.boundTo === moduleName; + public isInNamespace(typeRef: spec.NamedTypeReference | string): boolean { + const pythonType = typeof typeRef !== "string" ? this.toPythonFQN(typeRef.fqn) : typeRef; + return this.boundRe.test(pythonType); + } + + public getParent(typeRef: spec.NamedTypeReference | string): PythonType { + const fqn = typeof typeRef !== "string" ? typeRef.fqn : typeRef; + const [, parentFQN] = fqn.match(/^(.+)\.[^\.]+$/) as string[]; + const parent = this.types.get(parentFQN); + + if (parent === undefined) { + throw new Error(`Could not find parent: ${parentFQN}`); + } + + return parent; } public getType(typeRef: spec.NamedTypeReference): PythonType { @@ -996,17 +990,6 @@ class TypeResolver { return type; } - public requiredModules(types: spec.NamedTypeReference[]): Set { - const modules = new Set(); - for (const type of types.map(t => this.toPythonType(t, true))) { - if (!this.isInModule(type)) { - const [, moduleName] = type.match(this.moduleRe) as string[]; - modules.add(moduleName); - } - } - return modules; - } - public resolve( typeRef: spec.TypeReference, opts: TypeResolverOpts = { forwardReferences: true, ignoreOptional: false }): string { @@ -1038,12 +1021,20 @@ class TypeResolver { // If our resolver is bound to the same module as the type we're trying to // resolve, then we'll implement the needed logic to use module relative naming // and to handle forward references (if needed). - if (this.boundRe !== undefined && this.boundRe.test(innerType)) { + if (this.isInModule(innerType)) { + // If our type is part of the same namespace, then we'll return a namespace + // relative name, otherwise a module relative name. + let typeName: string; + if (this.isInNamespace(innerType)) { + [, , typeName] = innerType.match(this.boundRe) as string[]; + } else { + [, , typeName] = innerType.match(this.moduleRe) as string[]; + } + // This re will look for the entire type, boxed by either the start/end of // a string, a comma, a space, a quote, or open/closing brackets. This will // ensure that we only match whole type names, and not partial ones. const re = new RegExp('((?:^|[[,\\s])"?)' + innerType + '("?(?:$|[\\],\\s]))'); - const [, , typeName] = innerType.match(this.boundRe) as string[]; // We need to handle forward references, our caller knows if we're able to // use them in the current context or not, so if not, we'll wrap our forward @@ -1177,21 +1168,35 @@ class PythonGenerator extends Generator { } protected onBeginNamespace(ns: string) { - const module = new Module( - toPythonModuleName(ns), - ns, - { assembly: this.assembly, - assemblyFilename: this.getAssemblyFileName(), - loadAssembly: ns === this.assembly.name }, - ); - - this.package.addModule(module); - this.types.set(ns, module); - - // If this is our top level namespace, then we'll want to add a py.typed marker - // so that all of our typing works. + // If we're generating the Namespace that matches our assembly, then we'll + // actually be generating a module, otherwise we'll generate a class within + // that module. if (ns === this.assembly.name) { + const module = new Module( + toPythonModuleName(ns), + ns, + { assembly: this.assembly, + assemblyFilename: this.getAssemblyFileName(), + loadAssembly: ns === this.assembly.name }, + ); + + this.package.addModule(module); + // Add our py.typed marker to ensure that gradual typing works for this + // package. this.package.addData(module, "py.typed", ""); + + this.types.set(ns, module); + } else { + // This should be temporary code, which can be removed and turned into an + // error case once https://github.com/awslabs/jsii/issues/270 and + // https://github.com/awslabs/jsii/issues/283 are solved. + this.addPythonType( + new Namespace( + toPythonIdentifier(ns.replace(/^.+\.([^\.]+)$/, "$1")), + ns, + {}, + ), + ); } } From 4754feda6466cf23d0e84ce77bcac5f11549f8e6 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 1 Nov 2018 18:26:58 -0400 Subject: [PATCH 084/117] Explicitly use Python3 --- packages/jsii-pacmak/lib/targets/python.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 55d63e0b76..2b0e8b3635 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -23,8 +23,8 @@ export default class Python extends Target { await shell("black", ["--py36", sourceDir], {}); // Actually package up our code, both as a sdist and a wheel for publishing. - await shell("python", ["setup.py", "sdist", "--dist-dir", outDir], { cwd: sourceDir }); - await shell("python", ["setup.py", "bdist_wheel", "--dist-dir", outDir], { cwd: sourceDir }); + await shell("python3", ["setup.py", "sdist", "--dist-dir", outDir], { cwd: sourceDir }); + await shell("python3", ["setup.py", "bdist_wheel", "--dist-dir", outDir], { cwd: sourceDir }); } } From 4cdec2008a4572227ffdfb0d7331cbe74e9d8c4c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 1 Nov 2018 19:18:21 -0400 Subject: [PATCH 085/117] Handle return values that are data types --- packages/jsii-pacmak/lib/targets/python.ts | 3 ++ .../jsii-python-runtime/src/jsii/__init__.py | 4 +- .../src/jsii/_kernel/__init__.py | 10 ++--- .../src/jsii/_kernel/types.py | 2 +- .../src/jsii/_reference_map.py | 41 +++++++++++++++---- .../jsii-python-runtime/src/jsii/_runtime.py | 9 ++++ 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 2b0e8b3635..096426162c 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -560,12 +560,15 @@ class TypedDict extends BasePythonClassType { code.closeBlock(); // Now we'll emit the mandatory members. + code.line(`@jsii.data_type(jsii_type="${this.fqn}")`); code.openBlock(`class ${this.name}(_${this.name})`); for (const member of sortMembers(mandatoryMembers, resolver)) { member.emit(code, resolver); } code.closeBlock(); } else { + code.line(`@jsii.data_type(jsii_type="${this.fqn}")`); + // In this case we either have no members, or we have all of one type, so // we'll see if we have any optional members, if we don't then we'll use // total=True instead of total=False for the class. diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 7a976e4fb3..c8c2d3908c 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,6 +1,6 @@ from typing import Union -from ._runtime import JSIIAssembly, JSIIMeta, JSIIAbstractClass, kernel +from ._runtime import JSIIAssembly, JSIIMeta, JSIIAbstractClass, data_type, kernel # JS doesn't have distinct float or integer types, but we do. So we'll define our own @@ -27,6 +27,8 @@ "JSIIMeta", "JSIIAbstractClass", "Number", + "data_type", + "kernel", "load", "create", "delete", diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 28e1b30b52..42875d6e83 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -24,19 +24,19 @@ ) -def _recursize_dereference(d): +def _recursize_dereference(kernel, d): if isinstance(d, collections.abc.Mapping): - return {k: _recursize_dereference(v) for k, v in d.items()} + return {k: _recursize_dereference(kernel, v) for k, v in d.items()} elif isinstance(d, ObjRef): - return _reference_map.resolve_reference(d) + return _reference_map.resolve_reference(kernel, d) else: return d def _dereferenced(fn): @functools.wraps(fn) - def wrapped(*args, **kwargs): - return _recursize_dereference(fn(*args, **kwargs)) + def wrapped(kernel, *args, **kwargs): + return _recursize_dereference(kernel, fn(kernel, *args, **kwargs)) return wrapped diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index 84fe8e8638..46b100f861 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -81,7 +81,7 @@ class StaticGetRequest: @attr.s(auto_attribs=True, frozen=True, slots=True) class GetResponse: - value: Any + value: Any = None @attr.s(auto_attribs=True, frozen=True, slots=True) diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index baed667da7..c1223fe281 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -1,16 +1,27 @@ # This module exists to break an import cycle between jsii.runtime and jsii.kernel import weakref +from .compat import TypedDict from ._kernel.types import JSClass, Referenceable _types = {} +_data_types = {} def register_type(klass: JSClass): _types[klass.__jsii_type__] = klass +def register_data_type(data_type: TypedDict): + _data_types[data_type.__jsii_type__] = data_type + + +class _FakeReference: + def __init__(self, ref: str) -> None: + self.__jsii_ref__ = ref + + class _ReferenceMap: def __init__(self, types): self._refs = weakref.WeakValueDictionary() @@ -19,7 +30,7 @@ def __init__(self, types): def register(self, inst: Referenceable): self._refs[inst.__jsii_ref__.ref] = inst - def resolve(self, ref): + def resolve(self, kernel, ref): # First we need to check our reference map to see if we have any instance that # already matches this reference. try: @@ -30,12 +41,28 @@ def resolve(self, ref): # If we got to this point, then we didn't have a referene for this, in that case # we want to create a new instance, but we need to create it in such a way that # we don't try to recreate the type inside of the JSII interface. - klass = _types[ref.ref.rsplit("@", 1)[0]] - - # Create our instance, bypassing __init__ by directly calling __new__, and then - # assign our reference to __jsii_ref__ - inst = klass.__new__(klass) - inst.__jsii_ref__ = ref + class_fqn = ref.ref.rsplit("@", 1)[0] + if class_fqn in _types: + klass = _types[class_fqn] + + # Create our instance, bypassing __init__ by directly calling __new__, and then + # assign our reference to __jsii_ref__ + inst = klass.__new__(klass) + inst.__jsii_ref__ = ref + elif class_fqn in _data_types: + data_type = _data_types[class_fqn] + + # A Data type is nothing more than a dictionary, however we need to iterate + # over all of it's properties, and ask the kernel for the values of each of + # then in order to constitute our dict + inst = {} + + for name in data_type.__annotations__.keys(): + # This is a hack, because our kernel expects an object that has a + # __jsii_ref__ attached to it, and we don't have one of those. + inst[name] = kernel.get(_FakeReference(ref), name) + else: + raise ValueError(f"Unknown type: {class_fqn}") return inst diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 9b3a4cecd2..313f2260f1 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -81,3 +81,12 @@ def __call__(cls, *args, **kwargs): class JSIIAbstractClass(abc.ABCMeta, JSIIMeta): pass + + +def data_type(*, jsii_type): + def deco(cls): + cls.__jsii_type__ = jsii_type + _reference_map.register_data_type(cls) + return cls + + return deco From 620d8502e663690123ecde4a83ae1ea398bc6800 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 1 Nov 2018 21:11:40 -0400 Subject: [PATCH 086/117] Generate Proxy class to use when JSII runtime returns an abstract class --- packages/jsii-pacmak/lib/targets/python.ts | 85 +++++++++++++++---- .../src/jsii/_reference_map.py | 10 ++- 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 096426162c..a8a4cf2e96 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -152,7 +152,7 @@ const recurseForNamedTypeReferences = (typeRef: spec.TypeReference): spec.NamedT interface PythonBase { readonly name: string; - emit(code: CodeMaker, resolver: TypeResolver): void; + emit(code: CodeMaker, resolver: TypeResolver, opts?: any): void; } interface PythonType extends PythonBase { @@ -239,6 +239,8 @@ abstract class BasePythonClassType implements PythonType, ISortableType { code.openBlock(`class ${this.name}${bases}`); + this.emitPreamble(code, resolver); + if (this.members.length > 0) { for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); @@ -251,6 +253,8 @@ abstract class BasePythonClassType implements PythonType, ISortableType { } protected abstract getClassParams(resolver: TypeResolver): string[]; + + protected emitPreamble(_code: CodeMaker, _resolver: TypeResolver) { return; } } interface BaseMethodOpts { @@ -259,9 +263,14 @@ interface BaseMethodOpts { parent?: spec.NamedTypeReference, } +interface BaseMethodEmitOpts { + renderAbstract?: boolean; +} + abstract class BaseMethod implements PythonBase { public readonly name: string; + public readonly abstract: boolean; protected readonly abstract implicitParameter: string; protected readonly jsiiMethod?: string; @@ -274,7 +283,6 @@ abstract class BaseMethod implements PythonBase { private readonly returns?: spec.TypeReference; private readonly liftedProp?: spec.InterfaceType; private readonly parent?: spec.NamedTypeReference; - private readonly abstract: boolean; constructor(name: string, jsName: string | undefined, @@ -284,15 +292,17 @@ abstract class BaseMethod implements PythonBase { const { abstract = false } = opts; this.name = name; + this.abstract = abstract; this.jsName = jsName; this.parameters = parameters; this.returns = returns; this.liftedProp = opts.liftedProp; this.parent = opts.parent; - this.abstract = abstract; } - public emit(code: CodeMaker, resolver: TypeResolver) { + public emit(code: CodeMaker, resolver: TypeResolver, opts?: BaseMethodEmitOpts) { + const { renderAbstract = true } = opts || {}; + let returnType: string; if (this.returns !== undefined) { returnType = resolver.resolve(this.returns, { forwardReferences: false }); @@ -367,17 +377,17 @@ abstract class BaseMethod implements PythonBase { code.line(`@${this.decorator}`); } - if (this.abstract) { + if (renderAbstract && this.abstract) { code.line("@abc.abstractmethod"); } code.openBlock(`def ${this.name}(${pythonParams.join(", ")}) -> ${returnType}`); - this.emitBody(code, resolver); + this.emitBody(code, resolver, renderAbstract); code.closeBlock(); } - private emitBody(code: CodeMaker, resolver: TypeResolver) { - if (this.jsiiMethod === undefined || this.abstract) { + private emitBody(code: CodeMaker, resolver: TypeResolver, renderAbstract: boolean) { + if (this.jsiiMethod === undefined || (renderAbstract && this.abstract)) { code.line("..."); } else { if (this.liftedProp !== undefined) { @@ -448,9 +458,14 @@ interface BasePropertyOpts { immutable?: boolean; } +interface BasePropertyEmitOpts { + renderAbstract?: boolean; +} + abstract class BaseProperty implements PythonBase { public readonly name: string; + public readonly abstract: boolean; protected readonly abstract decorator: string; protected readonly abstract implicitParameter: string; @@ -459,7 +474,6 @@ abstract class BaseProperty implements PythonBase { private readonly jsName: string; private readonly type: spec.TypeReference; - private readonly abstract: boolean; private readonly immutable: boolean; constructor(name: string, jsName: string, type: spec.TypeReference, opts: BasePropertyOpts = {}) { @@ -469,21 +483,22 @@ abstract class BaseProperty implements PythonBase { } = opts; this.name = name; + this.abstract = abstract; this.jsName = jsName; this.type = type; - this.abstract = abstract; this.immutable = immutable; } - public emit(code: CodeMaker, resolver: TypeResolver) { + public emit(code: CodeMaker, resolver: TypeResolver, opts?: BasePropertyEmitOpts) { + const { renderAbstract = true } = opts || {}; const pythonType = resolver.resolve(this.type, { forwardReferences: false }); code.line(`@${this.decorator}`); - if (this.abstract) { + if (renderAbstract && this.abstract) { code.line("@abc.abstractmethod"); } code.openBlock(`def ${this.name}(${this.implicitParameter}) -> ${pythonType}`); - if (this.jsiiGetMethod !== undefined && !this.abstract) { + if (this.jsiiGetMethod !== undefined && (!renderAbstract || !this.abstract)) { code.line(`return jsii.${this.jsiiGetMethod}(${this.implicitParameter}, "${this.jsName}")`); } else { code.line("..."); @@ -492,11 +507,11 @@ abstract class BaseProperty implements PythonBase { if (!this.immutable) { code.line(`@${this.name}.setter`); - if (this.abstract) { + if (renderAbstract && this.abstract) { code.line("@abc.abstractmethod"); } code.openBlock(`def ${this.name}(${this.implicitParameter}, value: ${pythonType})`); - if (this.jsiiSetMethod !== undefined && !this.abstract) { + if (this.jsiiSetMethod !== undefined && (!renderAbstract || !this.abstract)) { code.line(`return jsii.${this.jsiiSetMethod}(${this.implicitParameter}, "${this.jsName}", value)`); } else { code.line("..."); @@ -641,6 +656,43 @@ class Class extends BasePythonClassType { this.abstract = abstract; } + public emit(code: CodeMaker, resolver: TypeResolver) { + // First we do our normal class logic for emitting our members. + super.emit(code, resolver); + + // Then, if our class is Abstract, we have to go through and redo all of + // this logic, except only emiting abstract methods and properties as non + // abstract, and subclassing our initial class. + if (this.abstract) { + resolver = this.fqn ? resolver.bind(this.fqn) : resolver; + code.openBlock(`class ${this.getProxyClassName()}(${this.name})`); + + // Filter our list of members to *only* be abstract members, and not any + // other types. + const abstractMembers = this.members.filter( + m => (m instanceof BaseMethod || m instanceof BaseProperty) && m.abstract + ); + if (abstractMembers.length > 0) { + for (const member of abstractMembers) { + member.emit(code, resolver, { renderAbstract: false }); + } + } else { + code.line("pass"); + } + + code.closeBlock(); + } + } + + protected emitPreamble(code: CodeMaker, _resolver: TypeResolver) { + if (this.abstract) { + code.line("@staticmethod"); + code.openBlock("def __jsii_proxy_class__()"); + code.line(`return ${this.getProxyClassName()}`); + code.closeBlock(); + } + } + protected getClassParams(resolver: TypeResolver): string[] { const params: string[] = this.bases.map(b => resolver.resolve(b)); const metaclass: string = this.abstract ? "JSIIAbstractClass" : "JSIIMeta"; @@ -651,6 +703,9 @@ class Class extends BasePythonClassType { return params; } + private getProxyClassName(): string { + return `_${this.name}Proxy`; + } } class StaticMethod extends BaseMethod { diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index c1223fe281..960bc860f6 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -1,4 +1,5 @@ # This module exists to break an import cycle between jsii.runtime and jsii.kernel +import inspect import weakref from .compat import TypedDict @@ -45,8 +46,13 @@ def resolve(self, kernel, ref): if class_fqn in _types: klass = _types[class_fqn] - # Create our instance, bypassing __init__ by directly calling __new__, and then - # assign our reference to __jsii_ref__ + # If this class is an abstract class, then we'll use the generated proxy + # class instead of the abstract class to handle return values for this type. + if inspect.isabstract(klass): + klass = klass.__jsii_proxy_class__() + + # Create our instance, bypassing __init__ by directly calling __new__, and + # then assign our reference to __jsii_ref__ inst = klass.__new__(klass) inst.__jsii_ref__ = ref elif class_fqn in _data_types: From 55f297ead99fb215afb79d016994d00e524ab115 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 2 Nov 2018 15:48:24 -0400 Subject: [PATCH 087/117] Pass overriden methods/properties into the JSII runtime --- packages/jsii-pacmak/lib/targets/python.ts | 5 +++ .../jsii-python-runtime/src/jsii/__init__.py | 10 ++++- .../src/jsii/_kernel/__init__.py | 40 ++++++++++++++++++- .../jsii-python-runtime/src/jsii/_runtime.py | 8 ++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index a8a4cf2e96..af1a262bcc 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -373,6 +373,10 @@ abstract class BaseMethod implements PythonBase { pythonParams.push(`*${paramName}: ${paramType}`); } + if (this.jsName !== undefined) { + code.line(`@jsii.member(jsii_name="${this.jsName}")`); + } + if (this.decorator !== undefined) { code.line(`@${this.decorator}`); } @@ -494,6 +498,7 @@ abstract class BaseProperty implements PythonBase { const pythonType = resolver.resolve(this.type, { forwardReferences: false }); code.line(`@${this.decorator}`); + code.line(`@jsii.member(jsii_name="${this.jsName}")`); if (renderAbstract && this.abstract) { code.line("@abc.abstractmethod"); } diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index c8c2d3908c..cddd95e6fa 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,6 +1,13 @@ from typing import Union -from ._runtime import JSIIAssembly, JSIIMeta, JSIIAbstractClass, data_type, kernel +from ._runtime import ( + JSIIAssembly, + JSIIMeta, + JSIIAbstractClass, + data_type, + member, + kernel, +) # JS doesn't have distinct float or integer types, but we do. So we'll define our own @@ -28,6 +35,7 @@ "JSIIAbstractClass", "Number", "data_type", + "member", "kernel", "load", "create", diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 42875d6e83..59d20604e6 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -1,3 +1,5 @@ +import inspect + from typing import Any, List, Optional, Type import collections.abc @@ -21,9 +23,42 @@ StaticSetRequest, StatsRequest, ObjRef, + Override, ) +_nothing = object() + + +def _get_overides(klass: JSClass, obj: Any) -> List[Override]: + overrides = [] + + # We need to inspect each item in the MRO, until we get to our JSClass, at that + # point we'll bail, because those methods are not the overriden methods, but the + # "real" methods. + for mro_klass in type(obj).mro(): + if mro_klass is klass: + break + + for name, item in mro_klass.__dict__.items(): + # We're only interested in things that also exist on the JSII class, and + # which are themselves, jsii members. + original = getattr(klass, name, _nothing) + if original is not _nothing: + if inspect.isfunction(item) and hasattr(original, "__jsii_name__"): + overrides.append( + Override(method=original.__jsii_name__, cookie=name) + ) + elif inspect.isdatadescriptor(item) and hasattr( + original.fget, "__jsii_name__" + ): + overrides.append( + Override(property=original.fget.__jsii_name__, cookie=name) + ) + + return overrides + + def _recursize_dereference(kernel, d): if isinstance(d, collections.abc.Mapping): return {k: _recursize_dereference(kernel, v) for k, v in d.items()} @@ -74,9 +109,10 @@ def create( if args is None: args = [] - # TODO: Handle Overrides + overrides = _get_overides(klass, obj) + obj.__jsii_ref__ = self.provider.create( - CreateRequest(fqn=klass.__jsii_type__, args=args) + CreateRequest(fqn=klass.__jsii_type__, args=args, overrides=overrides) ) def delete(self, ref: ObjRef) -> None: diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 313f2260f1..96ec90a698 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -90,3 +90,11 @@ def deco(cls): return cls return deco + + +def member(*, jsii_name): + def deco(fn): + fn.__jsii_name__ = jsii_name + return fn + + return deco From b01bf3da7c6df125efff3981e4b56e7f00e5444e Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 15 Nov 2018 15:53:44 -0500 Subject: [PATCH 088/117] Deal with name collisions --- packages/jsii-pacmak/lib/targets/python.ts | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index af1a262bcc..95631979c6 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -324,12 +324,34 @@ abstract class BaseMethod implements PythonBase { } } + // We cannot (currently?) blindly use the names given to us by the JSII for + // initializers, because our keyword lifting will allow two names to clash. + // This can hopefully be removed once we get https://github.com/awslabs/jsii/issues/288 + // resolved, so build up a list of all of the prop names so we can check against + // them later. + const liftedPropNames: Set = new Set(); + if (this.liftedProp !== undefined + && this.liftedProp.properties !== undefined + && this.liftedProp.properties.length >= 1) { + for (const prop of this.liftedProp.properties) { + liftedPropNames.add(toPythonIdentifier(prop.name)); + } + } + // We need to turn a list of JSII parameters, into Python style arguments with // gradual typing, so we'll have to iterate over the list of parameters, and // build the list, converting as we go. const pythonParams: string[] = [this.implicitParameter]; for (const [idx, param] of this.parameters.entries()) { - const paramName = toPythonIdentifier(param.name); + // We cannot (currently?) blindly use the names given to us by the JSII for + // initializers, because our keyword lifting will allow two names to clash. + // This can hopefully be removed once we get https://github.com/awslabs/jsii/issues/288 + // resolved. + let paramName: string = toPythonIdentifier(param.name); + while (liftedPropNames.has(paramName)) { + paramName = `${paramName}_`; + } + const paramType = resolver.resolve(param.type, { forwardReferences: false}); const paramDefault = optionalStartsAt !== undefined && idx >= optionalStartsAt ? "=None" : ""; From 15302f3d3f96ffbcb8a2c3cf85fc154f43e59bca Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 21 Nov 2018 20:20:20 -0500 Subject: [PATCH 089/117] Update the bundled JSII version --- .../jsii-python-runtime/src/jsii/_kernel/providers/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 718de28e7c..31e3f4422b 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -219,7 +219,7 @@ def handshake(self): # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.7.7" + resp.hello == "jsii-runtime@0.7.10" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( From b1df25e72ed2b7e2c928584d045dfd237f3dd692 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Sun, 27 Jan 2019 22:31:24 -0500 Subject: [PATCH 090/117] Implement compliance test suite --- packages/jsii-calc/lib/compliance.ts | 69 +- packages/jsii-calc/test/assembly.jsii | 109 ++- packages/jsii-pacmak/lib/targets/python.ts | 5 +- .../.jsii | 109 ++- .../PythonReservedWords.cs | 212 ++++ .../jsii-calc-0.7.13.tgz | Bin 116 -> 71184 bytes .../amazon/jsii/tests/calculator/$Module.java | 1 + .../tests/calculator/PythonReservedWords.java | 141 +++ .../calculator/jsii-calc@0.7.13.jsii.tgz | Bin 116 -> 71184 bytes .../js/jsii-calc@0.7.13.jsii.tgz | Bin 116 -> 71184 bytes .../expected.jsii-calc/sphinx/jsii-calc.rst | 156 +++ packages/jsii-python-runtime/.gitignore | 7 + packages/jsii-python-runtime/bin/generate | 12 +- .../jsii-python-runtime/bin/generate-calc | 33 + packages/jsii-python-runtime/mypy.ini | 2 + packages/jsii-python-runtime/package.json | 8 +- packages/jsii-python-runtime/pytest.ini | 2 + packages/jsii-python-runtime/requirements.txt | 3 + .../jsii-python-runtime/src/jsii/__init__.py | 9 + .../src/jsii/_kernel/__init__.py | 4 +- .../src/jsii/_kernel/providers/process.py | 12 +- .../src/jsii/_reference_map.py | 7 +- .../jsii-python-runtime/tests/__init__.py | 0 .../tests/test_compliance.py | 916 ++++++++++++++++++ .../jsii-reflect/test/classes.expected.txt | 1 + .../test/jsii-tree.test.all.expected.txt | 68 ++ .../jsii-tree.test.inheritance.expected.txt | 1 + .../test/jsii-tree.test.members.expected.txt | 35 + .../test/jsii-tree.test.types.expected.txt | 1 + 29 files changed, 1906 insertions(+), 17 deletions(-) create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/PythonReservedWords.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/PythonReservedWords.java create mode 100755 packages/jsii-python-runtime/bin/generate-calc create mode 100644 packages/jsii-python-runtime/mypy.ini create mode 100644 packages/jsii-python-runtime/pytest.ini create mode 100644 packages/jsii-python-runtime/requirements.txt create mode 100644 packages/jsii-python-runtime/tests/__init__.py create mode 100644 packages/jsii-python-runtime/tests/test_compliance.py diff --git a/packages/jsii-calc/lib/compliance.ts b/packages/jsii-calc/lib/compliance.ts index 25e223ab08..955a42578b 100644 --- a/packages/jsii-calc/lib/compliance.ts +++ b/packages/jsii-calc/lib/compliance.ts @@ -856,6 +856,73 @@ export class JavaReservedWords { public while = 'hello'; } +export class PythonReservedWords { + + public and() {} + + public as() {} + + public assert() {} + + public async() {} + + public await() {} + + public break() {} + + public class() {} + + public continue() {} + + public def() {} + + public del() {} + + public elif() {} + + public else() {} + + public except() {} + + public finally() {} + + public for() {} + + public from() {} + + public global() {} + + public if() {} + + public import() {} + + public in() {} + + public is() {} + + public lambda() {} + + public nonlocal() {} + + public not() {} + + public or() {} + + public pass() {} + + public raise() {} + + public return() {} + + public try() {} + + public while() {} + + public with() {} + + public yield() {} +} + export interface UnionProperties { foo?: string | number; readonly bar: AllTypes | string | number; @@ -1232,4 +1299,4 @@ export class JsiiAgent { public static get jsiiAgent(): string | undefined { return process.env.JSII_AGENT; } -}; \ No newline at end of file +}; diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index 53de34c5ba..d4e5fdc120 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -2852,6 +2852,113 @@ } ] }, + "jsii-calc.PythonReservedWords": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.PythonReservedWords", + "initializer": { + "initializer": true + }, + "kind": "class", + "methods": [ + { + "name": "and" + }, + { + "name": "as" + }, + { + "name": "assert" + }, + { + "name": "async" + }, + { + "name": "await" + }, + { + "name": "break" + }, + { + "name": "class" + }, + { + "name": "continue" + }, + { + "name": "def" + }, + { + "name": "del" + }, + { + "name": "elif" + }, + { + "name": "else" + }, + { + "name": "except" + }, + { + "name": "finally" + }, + { + "name": "for" + }, + { + "name": "from" + }, + { + "name": "global" + }, + { + "name": "if" + }, + { + "name": "import" + }, + { + "name": "in" + }, + { + "name": "is" + }, + { + "name": "lambda" + }, + { + "name": "nonlocal" + }, + { + "name": "not" + }, + { + "name": "or" + }, + { + "name": "pass" + }, + { + "name": "raise" + }, + { + "name": "return" + }, + { + "name": "try" + }, + { + "name": "while" + }, + { + "name": "with" + }, + { + "name": "yield" + } + ], + "name": "PythonReservedWords" + }, "jsii-calc.ReferenceEnumFromScopedPackage": { "assembly": "jsii-calc", "docs": { @@ -3762,5 +3869,5 @@ } }, "version": "0.7.13", - "fingerprint": "mc9Rni6GLgVDz8M6CGHapEiYbWsdEIl7CmBI0Qn+KXU=" + "fingerprint": "jnCuLI3bHYyebm/iuj0FzQ+WlO3DpHBlADB7GWQc6pk=" } diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 95631979c6..27be397b90 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -232,8 +232,6 @@ abstract class BasePythonClassType implements PythonType, ISortableType { } public emit(code: CodeMaker, resolver: TypeResolver) { - resolver = this.fqn ? resolver.bind(this.fqn) : resolver; - const classParams = this.getClassParams(resolver); const bases = classParams.length > 0 ? `(${classParams.join(", ")})` : ""; @@ -242,6 +240,7 @@ abstract class BasePythonClassType implements PythonType, ISortableType { this.emitPreamble(code, resolver); if (this.members.length > 0) { + resolver = this.fqn ? resolver.bind(this.fqn) : resolver; for (const member of sortMembers(this.members, resolver)) { member.emit(code, resolver); } @@ -1433,7 +1432,7 @@ class PythonGenerator extends Generator { } protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { - throw new Error("Unhandled Type: UnionProperty"); + // console.log("Unhandled Type: UnionProperty"); // TODO: Handle this. } protected onMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii index 53de34c5ba..d4e5fdc120 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii @@ -2852,6 +2852,113 @@ } ] }, + "jsii-calc.PythonReservedWords": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.PythonReservedWords", + "initializer": { + "initializer": true + }, + "kind": "class", + "methods": [ + { + "name": "and" + }, + { + "name": "as" + }, + { + "name": "assert" + }, + { + "name": "async" + }, + { + "name": "await" + }, + { + "name": "break" + }, + { + "name": "class" + }, + { + "name": "continue" + }, + { + "name": "def" + }, + { + "name": "del" + }, + { + "name": "elif" + }, + { + "name": "else" + }, + { + "name": "except" + }, + { + "name": "finally" + }, + { + "name": "for" + }, + { + "name": "from" + }, + { + "name": "global" + }, + { + "name": "if" + }, + { + "name": "import" + }, + { + "name": "in" + }, + { + "name": "is" + }, + { + "name": "lambda" + }, + { + "name": "nonlocal" + }, + { + "name": "not" + }, + { + "name": "or" + }, + { + "name": "pass" + }, + { + "name": "raise" + }, + { + "name": "return" + }, + { + "name": "try" + }, + { + "name": "while" + }, + { + "name": "with" + }, + { + "name": "yield" + } + ], + "name": "PythonReservedWords" + }, "jsii-calc.ReferenceEnumFromScopedPackage": { "assembly": "jsii-calc", "docs": { @@ -3762,5 +3869,5 @@ } }, "version": "0.7.13", - "fingerprint": "mc9Rni6GLgVDz8M6CGHapEiYbWsdEIl7CmBI0Qn+KXU=" + "fingerprint": "jnCuLI3bHYyebm/iuj0FzQ+WlO3DpHBlADB7GWQc6pk=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/PythonReservedWords.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/PythonReservedWords.cs new file mode 100644 index 0000000000..d1b8b845d6 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/PythonReservedWords.cs @@ -0,0 +1,212 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiClass(typeof(PythonReservedWords), "jsii-calc.PythonReservedWords", "[]")] + public class PythonReservedWords : DeputyBase + { + public PythonReservedWords(): base(new DeputyProps(new object[]{})) + { + } + + protected PythonReservedWords(ByRefValue reference): base(reference) + { + } + + protected PythonReservedWords(DeputyProps props): base(props) + { + } + + [JsiiMethod("and", null, "[]")] + public virtual void And() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("as", null, "[]")] + public virtual void As() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("assert", null, "[]")] + public virtual void Assert() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("async", null, "[]")] + public virtual void Async() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("await", null, "[]")] + public virtual void Await() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("break", null, "[]")] + public virtual void Break() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("class", null, "[]")] + public virtual void Class() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("continue", null, "[]")] + public virtual void Continue() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("def", null, "[]")] + public virtual void Def() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("del", null, "[]")] + public virtual void Del() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("elif", null, "[]")] + public virtual void Elif() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("else", null, "[]")] + public virtual void Else() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("except", null, "[]")] + public virtual void Except() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("finally", null, "[]")] + public virtual void Finally() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("for", null, "[]")] + public virtual void For() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("from", null, "[]")] + public virtual void From() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("global", null, "[]")] + public virtual void Global() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("if", null, "[]")] + public virtual void If() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("import", null, "[]")] + public virtual void Import() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("in", null, "[]")] + public virtual void In() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("is", null, "[]")] + public virtual void Is() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("lambda", null, "[]")] + public virtual void Lambda() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("nonlocal", null, "[]")] + public virtual void Nonlocal() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("not", null, "[]")] + public virtual void Not() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("or", null, "[]")] + public virtual void Or() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("pass", null, "[]")] + public virtual void Pass() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("raise", null, "[]")] + public virtual void Raise() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("return", null, "[]")] + public virtual void Return() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("try", null, "[]")] + public virtual void Try() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("while", null, "[]")] + public virtual void While() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("with", null, "[]")] + public virtual void With() + { + InvokeInstanceVoidMethod(new object[]{}); + } + + [JsiiMethod("yield", null, "[]")] + public virtual void Yield() + { + InvokeInstanceVoidMethod(new object[]{}); + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.13.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.13.tgz index eef7587bf20015975a43efa48f8cd0487c889042..cdac38023eb3761e5f8b01a6bd16b19a4cea3b05 100644 GIT binary patch literal 71184 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

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java index 9c05612367..e1c2ab5806 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java @@ -75,6 +75,7 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.OverrideReturnsObject": return software.amazon.jsii.tests.calculator.OverrideReturnsObject.class; case "jsii-calc.Polymorphism": return software.amazon.jsii.tests.calculator.Polymorphism.class; case "jsii-calc.Power": return software.amazon.jsii.tests.calculator.Power.class; + case "jsii-calc.PythonReservedWords": return software.amazon.jsii.tests.calculator.PythonReservedWords.class; case "jsii-calc.ReferenceEnumFromScopedPackage": return software.amazon.jsii.tests.calculator.ReferenceEnumFromScopedPackage.class; case "jsii-calc.ReturnsPrivateImplementationOfInterface": return software.amazon.jsii.tests.calculator.ReturnsPrivateImplementationOfInterface.class; case "jsii-calc.RuntimeTypeChecking": return software.amazon.jsii.tests.calculator.RuntimeTypeChecking.class; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/PythonReservedWords.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/PythonReservedWords.java new file mode 100644 index 0000000000..3d46980d54 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/PythonReservedWords.java @@ -0,0 +1,141 @@ +package software.amazon.jsii.tests.calculator; + +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.PythonReservedWords") +public class PythonReservedWords extends software.amazon.jsii.JsiiObject { + protected PythonReservedWords(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + public PythonReservedWords() { + super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + } + + public void and() { + this.jsiiCall("and", Void.class); + } + + public void as() { + this.jsiiCall("as", Void.class); + } + + public void assert_() { + this.jsiiCall("assert", Void.class); + } + + public void async() { + this.jsiiCall("async", Void.class); + } + + public void await() { + this.jsiiCall("await", Void.class); + } + + public void break_() { + this.jsiiCall("break", Void.class); + } + + public void class_() { + this.jsiiCall("class", Void.class); + } + + public void continue_() { + this.jsiiCall("continue", Void.class); + } + + public void def() { + this.jsiiCall("def", Void.class); + } + + public void del() { + this.jsiiCall("del", Void.class); + } + + public void elif() { + this.jsiiCall("elif", Void.class); + } + + public void else_() { + this.jsiiCall("else", Void.class); + } + + public void except() { + this.jsiiCall("except", Void.class); + } + + public void finally_() { + this.jsiiCall("finally", Void.class); + } + + public void for_() { + this.jsiiCall("for", Void.class); + } + + public void from() { + this.jsiiCall("from", Void.class); + } + + public void global() { + this.jsiiCall("global", Void.class); + } + + public void if_() { + this.jsiiCall("if", Void.class); + } + + public void import_() { + this.jsiiCall("import", Void.class); + } + + public void in() { + this.jsiiCall("in", Void.class); + } + + public void is() { + this.jsiiCall("is", Void.class); + } + + public void lambda() { + this.jsiiCall("lambda", Void.class); + } + + public void nonlocal() { + this.jsiiCall("nonlocal", Void.class); + } + + public void not() { + this.jsiiCall("not", Void.class); + } + + public void or() { + this.jsiiCall("or", Void.class); + } + + public void pass() { + this.jsiiCall("pass", Void.class); + } + + public void raise() { + this.jsiiCall("raise", Void.class); + } + + public void return_() { + this.jsiiCall("return", Void.class); + } + + public void try_() { + this.jsiiCall("try", Void.class); + } + + public void while_() { + this.jsiiCall("while", Void.class); + } + + public void with() { + this.jsiiCall("with", Void.class); + } + + public void yield() { + this.jsiiCall("yield", Void.class); + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.13.jsii.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.13.jsii.tgz index eef7587bf20015975a43efa48f8cd0487c889042..cdac38023eb3761e5f8b01a6bd16b19a4cea3b05 100644 GIT binary patch literal 71184 zcmV)EK)}BriwFP!000001MI!|W81jVFx;Q>SFqmqd)D4MiVh!fw%fjvPkDXBmha8J z8;YbP#uTZNlx?L?{`YTY0FdA*Qj(o)8@E|oA_xrTo&hizsoK5TH{Oic@5(37vH!B* zpK7(bv9_k9eGfm4^;$#uORce1Z!|U<>y5@=s7BCl$urH@nrdlFtN8VU;d-WHVsiNx`QwKt}`CB_52Q{Uf>ng_068D`Rpxe ztf0{s{?`}r-jeS4w&6$Tf+X}{LNuEu8%TbRF5d||0ID)YX_{J(kwZ?)Fzn1$S~ZUX9Xu1N;e)dMk1kogEXNR z-&ShXN@G)=NY?y__^*A(vAmQf)GzT1J#18Jm5mS{b?gruHv~f{F2=ITwb4~NhWlV@ zh7hx*v1?(Af$xvJcW>UPkDd@o%^8YDj@wsl^Rvoz8mgLLOwF-<*X)jg`$JXfxKG412$v+ zCTO>T@w#5AGLzyOBgZp=oRg4|knON70F%Ku5}3e4mfH15ek%9|^2)0(U)z+=^usm( z8&Z?cG)A8PSKq8wYa87ETidAD>uccuRqJaT-~GRr`1$vYYBfb;@+Wa|6}{8P-wSEw zxU~);D`p|*RN2K8PGJo{i^^UY2tvcpr?M9YPDI1URCYNRE0{#;YuT^9c6#wHs4;p~ z5k}_UCnE_lZqf^v&|1zHue1Q7(;oge%|90)miE%6eiNQM`}qG7=EnO>er zLuX84k(xRaPw8ATlh&p&rW&6d4Ib|xrc=JUzp;2v<16_X-W^K+Q=A^n4?Fqc2c<*n9YK#h6EN~jy|@G5BBoM0Pi1HqWzkH zH5iX(!u}U#VxA}0%2$;J#!wX;@unvDB(B7g3T&RmvYD64gkK(0ODQTTdreT1{!(h_ zOC0*b>L&(!WI>gyn@}EOYD28+##48dW*5aw^S3S4i}a}S2XVV3R`inMPmdEp#ZvEI zcBE}|$d+VNL)7HI6OLxurf;g2`Pp!zgGL|lHKgbmpb88ZNE=J0MYMPVj<$HIjanBq zhoQG7QRoutJxs>kn>OR4=ro3gKXCLMI5LRANY8b#Xmd=R#f`cPt$f3cju9Ux(jWa! z27pXqq_~A6*Bk=U9~eXXF6g|3PnYRD{T>0=H9*PRDSr2qF~S}tHa`Dhq)_?&c{s?G(X`+%=wLjYJ%1x>MyGpR!cNQTBJ4oO*kQC3?fskbn#$tEdA zL;YEX`-}TH8S~B(23;?~`UQNimT5z%bqW(>tHlYHhJYxRa{$jDDT)1DKoIg_>2DAM zb*Uf45gk>E_;9*jKQ>|?HZm)B#40h0RgULyGQ~*zQejH>#3z;DMcdU<1WCz&Q{p6lowIYQ&D_T z0F#AuJaw`V949!jwCh_acF3{{mUR({=ck*7DQeyH6p{=~mRVy!hr%g0QF@N6sFtNr z20`)0qmkocCapW6lvhPT@_2@iYLw-o0L`WjO8SHC4^%%C1Z;&#J}w-_)5y@UC+wMJ z`3A1@s5l}4R>-CZRD2WuoB>o_RQR1_R(hNreo0}?Mc&h)kzsYQgbW|gn}ja6Rcq{pSoZQ2F9PhrY1OEMM#U7)&jFW zR!4t|ISLVpwJo_!>VbX(3$4HVG;ZN!Yt(=Y%A`ZShE$w0=W}E+Qq{e~Lpef(} zp7?J1rmKZ3c_PKj`Vh}f{d9}Te#%n+x!J0O2IS)`n3EQyJ&CAgm?(=2ayTHBVG2<` zg*ekY%c6GC&Jv2_cx?IR$VxcPrMoP}G;vn=eIeAox1Glqw;SI;#KmX+Ulw)oS-*Vb z<VKZ4Q@Ni+mduEJJ2Zyfc!Dbxfya{& zb%n8h>x|tQUc=00+uO%Aqr7c7@my3GDy8Dqc{FsE=A%7nb7DB&+c%NP>>GYdb?47w z{xPaO?;fJnqHxq_h9lkT=HyVPvggz#4?zFT)6?<_rps-|#{@jGiL&e&hGH9i6=CyM zR+aA9S9oJ}RjE`e^onz@P6{kL!Hav2Ge41Wd+d9B?>~0Cn71f#c=|S^Ve-7fP!x>M zGlP+m$xDG_u|nyQxGX;vlS(g;%5G`F^cEzT|0V2}PUbu-AGf(#w%(iA+Lh`0W7Rqi zOy}&zKBc>F!rB9L0MHy;U{~W!oT2F%OL;ErtWtP5_Iy0;VtLAkVEO*oxNw{gOVcHb z&9wgKm@2KyGa~XC`?LXzP2$6nq9Q|y7Qh3h3n85~SydhfrZ!-!@$icM!8Yv&=iX3M z<$`c3&xE!Zj_@8o*h5gd2!_gN&{eg2c-J*ZANC#G z3gbI?8by6jO$!%j6%*#8o2qXxz3AB1=2&+=!mU{UXlGlaU@JPx8L`lW{dat{in0;KP_?CEOqGi zo@*MmE@$c&ce-r)CRcT$3=D9a|2o|=Q@e$1vP_wCe9-6I$eO7-7P6^zy1>q`!8I<) z`Pt}#J6q@XV++Xc43muu^@1lW_#(r)hG&aQM1%znXcSw@FK9}eN_cvh#{{BO99l4K z?7GmB@6JW?P(}kD>2zW}u)T#$t%Q*UTG_By#p!;6@TT&04Q*SD!<>>(7gUOwB7C8& zF-pVn`;>l^yw#)Pw(8l;NK@C5q|7Z=cp-)e6Bda4RQ+pguKwB!0(_w!_$-Mu+=?%- zS^$9%(ES%8@C4JdY1k`(G27^;DxH#6P=%;3lYArRu@Lp3-G3qV*uhUgo-yD^pAW;x0N(pS#bKIe!FODY1>gWY%lKXn0E~rsy(k9Robd^J5dZ{pv%(>O8(818M zwjA4ki!n0JWvD)x!|_nWV=NXkZB~y=DnnPm$5WpQ?@fz^42f*@oNE$OXTJNSQUyDd z>ClqX5|gTF#t8Gk+|HxX$NgCaFi?8;Z$26pwKq7mC_+-il5$zBw}tKJ4ZD1gj_HE- z@V=7U=H*mabX($hv+ApytdRwc-0aBvz~iDr&f7@=E0pbsM&g0;GZV#BQry4TyYp7} z5d-jK$hV>bih#^@-;0AhjU_P$a&7v9W9B)WQV!|}d{0bgS>C>#mAj)%FraR|hK^<)=md(z|tjx~n z3oIp;$w9MKU(6DsV!4uqZGz5Y!*6?HQ%u5+(Nn>3HguU=-2Rwr?wM_SZojjb^cj}4 z!h#X~_(_b+Wv5)N;(Vt`B2cryUkcoyK|H6i9+p%V}nm}K^>+?ZkiRdos{-@$Vk)!bgxKki3zvSqAO^&d z8DX`HY+7O*cPi}spK7T$xr`TcPzseSm_sr||4n-VD>?I3fhYwot)D(WsTW?GZx-@S zb6%ViCpZwrb2D?DrA+VeIem%ZnaF`^_XSKj^+#vAl*M>V_Czh7D+f4LBtnOnCd^JH z&Ag#%o&?osD$1Ypyg)if=E=jkp*ejUSP>Lk(>o2tY$59n*#3w5+qHL!?$Gf}R}80o zK*dMrN7)f8Hn5_K96%@pRC4Noiyq9uhi+1U#(oqA&p#JTXHz3FwT7PQQl zgP4V_?WN6q{=B5%t_=3sr`zaQ_IEDUiFWi=U83oE)nKnPPxkZ8&PpU1PN#HTp^f5A zr3`!lrNq_|^b3bxo8K|hV~Z?7gA#YvL^J=zz4>DLZ-(`Yg_;jMmc=E5uinI{>lLLP z?#1D+o@D0H|D%bxkad7kl*6nE*~|}1f_f3A;ne%N81?AIlVpXUnW)xFNH9H~ZFwM5 z5~4Vbf0`w-n9T>tQ0t2`depPnWn6q|DixayOx)>)djdshGwmMKEX(K`h7ay-bKIxf zRp+`GH`&=Yku>PiU2+1r1;~a7EEXglsgX*QjPXwk3c8DkMuMgpoFrypmg1q@g!Ar$ zfo4r~%Wf1j@Z_2u?s#X1*@7s!$c6Kcy_Ul;HO zMAMgAaG85vSB=$xxA<{*ii>vok^opy%B%R;*wEW&~%uUUZ)Apy{}sN2#QC`0TbY zteAVjR!WMf-F#4AgzPDoNxvw?MI^yyFShqD?6ji#=vjax(&j(ZHrGGcZTY0)6CP7s z#$;4?Y+5=v2d4o2XH_YOok;1xJ;x38k|B9?EXGk6&WXwyby3_Dbooti z5+h3Lrnutt%9tSwI_INVfUR=$n)`S{Zoe-P&=muqY-ywBi+B+7h^?132os|SE@q$yPZFJ}TwDyKohE4{Ed5PBOv+5;K-&0FL z(=%J?2jR_*6+M3~%fy*v6 zK*Z%M@`~ly1+E4QR=p$#rBHk0u|(ssRe~=^s&=pTOTfZwtCV@c@xd!G^b)Ut8Zouv z?fEKq;r8C36vOe_(l`7M^gmQjx%o2!va4cY;h+*V^r35qC9%LEM{c&JgFS~kn2!A#E zp0BuLaBzl(@?f}_e^NZ!=BsoK#WQ^6!BmyQPP_d_bAR{bqQDYr2;_?d zWXaJMez{-d62uS}ieW#PAn`+XC6;Sq)_C3<(LN>SLyse+`3tbz3oY**IjY`LE%X%h zJ=MiqKRX~+re?gzr9y1Ef9vf#p%?N^&N+cH_;!hOw~1TJ>5n?v_h8?J(GqF{A(ggaH(O@QDjgGyikyNc@jsx~lm zyjOVQj9rCKLGjoeD$2IwB8nXd53o^efFX2Er;K8ZDIzBT>uq)V?zy1X_vmXZRxB2M z_fjD`@Y|XJ|JrDb_pte%GWGz^-3d{|SH1hn2fRVm)H$2428D`&*M`W-j3O@9MZ}&S zq{ejj7Iri=hK@T?f=$)$KG^m34Q07fUsoQs-(RjMua)M5YSL~u(VF$~PN`Pb_gkw< z4gXW$Z+)=WYjt?Fz?4D$BD76OOzEKA!5 zJ0?XD=EBwi+ehRQ-%LtT=F1Vu#CN9(QD#>WImNDu$x!yZWLcH_%NL={{vx9KB7z3U zoi1pM9f3Lj?Bcc)GW_GfpndU(%BJKbpi`r?gp=@SS{6nT35O8*!_+YZ#yuoN2Rfqvlc=Hk9^zMb&k@IXsVJWBJ#745LUC zI;*lU)J};uf(uuRhZO~G-e{S&>P`~3qla-oZU}NgwQ7F)u%vXUpYWROA`wL}qv@e? z3J*mtJfs`>uuN6Pd?K`7OwG1bwvK{zWc2*k1Jvf8sT&MAcI*<~*de+w-#aK=2CifQ z{x4Y)P=12vW`8jA4BeNRVeogd>fKxwG|eLU)bfQ7gcg{4Y4&9*f0QaNnTEOea9^?X zW~5xmRD7gX0QpZs$A4WV(wX^&unz&%2s{vxXcG|>Ip_tjV`$DqP7X{EcYe9t>5uGqTQD~ldXHn`^)z7fgICY#d`QH2v7PZs&Xd*B00M-+i_${LbUEojAJD@xjiiu6|^8T`=}#T((@}Z+O1aGoOG(3|w{w z^q9Q~tJ;TsDMLpeTf9svF7zO$+W?Q^aex$yK~yArmo|~--19QOmAu3fu{ht#Cr|mX zq`8xk?|fL|XrYCAnAq5&rTl@4OHXv~C=;ig$~PaDHq^SV)~j1uI&R z)-%?--L=hbSKm^NwZ_`pEwxeItZ!^>)Vu4O8@)B7v9;AO)~g?u3M^U@yd45;mZ~|= zlq67f%)43+;12hdIAd2cfC~Yk%i?3jfAUupRcsP;#-26FMJJs~UJbhYYZ3JHymP8` z9^aK#3OR}Fy)!gDBg&}@!dwTi5$rkxJ`3S5g&L)Ed$L^;K{)inIVjt%ucDc@2}}z31b+Z0I?*ELM`VWn9qmhu-uq zZ5>x}OI4dIaDZ{P7;-YI74O2q%W9AS^8Q@?-jDt}$9ut9~v9P}5Dh_FKkD7k4!;475oN}SSI;$e=%lJV3 z)JhpSPRI;Pw=d^=0Q>~SHNp{eP)4*> zE3{jMlv36NzU_>koEY%NLrUjCeZrbd}?L&`Zy%#-3&KPA-e!j(HW&YZc~|V|DbMQxu6)V#wpKd_6wNv^ZHBE=!|x z2X|YXm2li3Y?!0IPhPh#>bi4-S~O z2-_^|*3txL%)Mxup}mVjQ!fq8EQ?`9p=m5QK%Tug{V87|=SGfa8s||@sU3b*Coo7= z7>l@B9K7c_!@I~`7vG|tOC@0j1HE^w$1Y=yfuuXiqtTDs3 zi3HEga3fQ4C*M>buFzbKC)^WC8*?b7MtALoyXoMc+fk%;|41) z=!Of5Ru@;3&%4Vc1ZnnN%Egpu62NbVFa^bT2K>h5dcl*P;-|l#fY)L#tVnQLci)85 z6*(I`ZQ(&JQM|8gHDTI|Sfcr(YL=;0T(0zR`3k<}OY)X!T%x$AVU?-fTCy7NlV*&{ z6sRp-0JlslUvkc#strc6UE+{LzS-iRFm#E@8!P-zoc3q_zm<-c)F4iG;ZMH(vLDQ+f=T(6h zv;f*M3?+Jxc;jt>kZuZa--OM?+Jk%XJ8WjUP$fFaW7_>34`yO%$#idK3LAOqgOPyv zMfQ1?o_(x~LfaWLrJ^V|mD$2j@b;n?A-kA(rlb>3@|(tkD?cf?IPJ}H2~vLbUc(xB zieYSa^ur#cW0DiO-bPT1C);&P{s&aUq0`bRa=~i$;`B zen_W2pj`yKDC7)Qf`ng5pnUwe%b(&EyL3Ox$B(Na>?$@%y%YZ9#|R9bL0mZS{gL=O9dx6S}%|a+!XK z@|s}y!t@`*s-g;^EpSvng%Dp)W4&6sESBh42F^f5zVf`;J zqFT_ts^IU%ZQ`G*FAhCyLT4}79T8kH6xgmw&5v2@nZ-Y2)lo?>KSy6D@%^z ziLxw;d|Oru*b&g__p^$)EIGx}4%2oPM0$x_=TX>@ej0mz8oi!#w?jfoi@5*nhP_z| zA=BNnC2t?oPjI*h7YE&^1)6%^4O#4wpQe>7A&_yIhR6#v=~Lq#ya`R zYH`*ASkGKygq1eK^znS2ZqQ4@Av7Z24h=+If%HwY_>xwuc+>47D__!VvanVPT`#@& zu_>1YrJS)h9(rOI4X@Q!=tN*={JcAP1B}b#ENna5_bpy?t|~p(7B2|DeA?Ird|AM@ zQ1ch4(@^?kT(%J}UbtbJexBIcmFfCp)jAGB>Dl#kvbS#{R}a8hhTHa<-i%etxJ6!# zH<`J#TO6|4qtaQNg&?2l=w@$nilzBQ?VPW$;yzz;q2y#q&`x`xCjRqh>>8@xd}*G7 z5nR)FFmkx+`D#tZfxv2or?xfu+Hg$cy61=FK~~H2vwW!nCgoQuWOjdH{(W@8-D!Sp zrBE76NsFKKf^)3%!uBMf&T%p&?wPVh!Gh6?oG6al?wO}L&)`nBdVOXj`&mltna6!# zIyA?wJaaDNV&IlMm6&jlMHk3&)9&Jr|jTGj^)u>H49#+jFJ5rm6>9W9QJm zv7TN?;T9+aq$(rV=$TJ!<^R#NEL_~jjb>!;!|JcW;lJ)g`S|e%)uT$lctkGBn=!>6 z9`V9aX4-9?T0%3{(F4ctQqB^lBq|y07iSqbdY*YVHSVD9nJzeIe9c~LtEOdj+&BQV z3<$TZ_F!y!{_!KD$H$Mj)$+mA@f@U2J3XjkCT#^VhsH`Jp@|ZTEi5_VdZjGL!q0sa z!Wp~2o#V^nI5KU`8tZgkHN;34Y%>Aj^+`mQs!=Tr0g9jhM*nYT6aF+_p7p@ej9i|aW&ylC|J6ZFJOYQ}53KF?%qLcmmdDlX z>LA_F9GC7!t_ZnbUMZj?_Kbbt-ubEmbre|@HHjP8F~diCYiU%vnRm;H=bP0}~p2hEfH-J{d}%1~eQ7}aWZV{J`I z`@UMOZLU=}l)uy(YxPEBqp{v-{H0o})#~fYU#g1+B<%+rebog}=Iw_jQ&ocBf0Cac zlx@1?UO965uU<7ROR*ht=oO8=XV+e1s02Y8-6t!SNkPw!d1OQjN6@5af@AOsOECYo z?br|SkTw~j1p^1i`+ZrI57nfn8hcoA-2MvLJNAXrA47a#nKp!3uU`FKrOHXa2xa$= zzrRuc@#=>kl;7AFVb@ueNm0G3uJPu9UZ__p74}zSMOm&_Yg@0Ywb#|g$}9Z&>8BIN zH{Sj9lXAt>tkNA1M+%;ZAqct9gxkg90M_FG*2@A|3jnM$0N=i@)nC_Y2;dLUZEM_D z_Rv2CXqBISV%2UD;_aZgEsOVqg0UFcM#{y~W=>`Kw;vky+H~-O%C5B)0O+?ZZGB7C zv_jJYYQEv^R|Ncfh6>Oz@UdR+AI<&UlM4pTdI@OO2^y_e)2muBE!S8PmMfuD<%t`-my zfpJiWNa^aXPdhx*pr!mmKv6&j@gKL(@J*((JYCU~XF z04qSn0I;o*{(5#mL%6Xjgw*Troo1aK5ri^6|1eOutzc%@U@p8xXBPAjRfZTmwN{ zn%i2V*R5@+h3CfG%X1UW;P-1yzyG1Oo(~3ZCm@05#1L*bIO?GaUAIKWgX zVjE0Y>Q`Y~x&nC#ACRIeVbZFMp|qL`enA0~B!q>vPxWa+i8pL86dG3h1YmV>*1w|G zN&g zhpMj)AkrGB52oV+g9kIjnC!>)kFWXeRh-sl3AM1v)k33IZS;!U2Ht)ph4h;-(if1u z2P+X;+;*jg{{cS2jn1aE8A zTHPql1g!naN-REO7fmP*-L|Y)CXiIMJT!@}xHX1phP4u2#@ZIaxKY!(4YdHHaTs~~ zD5I{GaJ$ytrYQQ&&3p)A$^@FHaMVVOql#(ekfYWGM{Nj>s&2imPvfZI5(qhXdIYMF z)5bh$c56!Lr2)zsC1kt7l=%AQ+iq{Gc>K)UM@iKv?#x5ms3R(B-zy)%3;h^wWnj~D zjem_zoGMMPgm2bhrWEYW=2{8e!rRBDSHk6JRMV}nHyW7s6HZvQEC_t@^w7|tOciQT z=7TD%l`?>bV5IS~9@lW(zG|DFvDpZe3nHRkLL}=|zHynPfA^%5dkr%0&w zwz!#twkZO*9uvS~@n0x_YeE3mB>}8uT66V5l~uaf?IDs_L9VJ^B1;2pi3W}O`ewae zoEdrh7!67=W1Yo`MTQJsX{2b5OXw)(ZO}0OU%Tw@+y4upjxJ`9D<;L zJEI$`=+yMa^b+NHP&le36h-wd2}ifF364syuyFA95#fLcqqw%&T+fe}&W+ddt}FbS zRRLw1;q~iB@{3VPgR`fP!5!{W0cyp-DmZA#pdHV5)!r7z2(%@PY;LS=*1N?$J>EXe zFHR(cOL9<{4h}fz?d$s6#jtmfI%TkxOPp?m3cf1CR?8>u-q@wRqBbq&qjeQ5&UZWz zAJ;aEdmPY~sHPi@UUj2*kjC3b_;{nZj^9XAwcjziSd4DOjMqj<Rl)ck) z<+8K8s+{k>KR?~M+{Uk0snt%qb8+5oUE(*?L9K#$9Xc+8XH#B@-FJLOONuwZqy9rf zW#^y4l^lBHUxJ6Nv$sg)jy>?YF;RkECw?t9@?l%u#NCA5F&!pQJ)T*hQv)5gH`r5Z zwE8~o50ou-Sj6;#Z8UMX95(?NXxNEs_6NS=JleSO0WPoYoBjkdp99AQ*`=-%Ku~S4;HbSuy$C1(4bYZ%!_S)IBh1Fq(11|ib*xnd zY@qmH5zwnR8~hg61=$`T$L2lphII2XzuuSztSEa9JJLTIyCc&50agQo2b(QkH71_re|#23%#R+Mqf`=>cyHQ3(TV6|E*s zAE-~`(s3$R#>}IM+=TgP6Cfe-cms2UJ@w2UU~^=+8g{+BUj6@8XgJ3eSI3Etz`OGS z>qrA26ZnRrN9eL^*nkAh1X4zNm*5OZe(Q{vlx19shQHjU6`AUE>9lS>nEDv|auu0B zcn8K4Kx>kh0B{dY+D*&(j0pjeCBbSP7)=8aM8_k}X(LLAV-k{{_6Xy68>2!+;Q4i+ zo**#W|BsJB2q|A{;kJ5qkErML{6}Ojj|Susw2(dOhnf)<8A%rS)rmuO0V3p%fnBOM;m65OP{5 z0;Vmd5eNW79iP@v)j^RwsHR2R4w?K*dTAB4DKem@a#m6Uy&$w3puyC_OW5U#7N}Ny zA8m`ywlXqkc^AucmQlrggTnSWvU(uA6h?D|%eCec2$SVJu7p_FF=%DUd@vM5h_@8y z030J72YmLtCx!z7I4)#TQ92Ywao7yGhv_ODipYhs@HjBFfusz8SiXa2qk-`rOd=(6 zF>dE%a-tZ3VSc)WDGE+zS(J=Ked|Edy4 zAIBbYvpB}{NZ%7;Tw|!3fqWXcG=rRic%f+w4cCCE$TIDFLR=TP1^EPnp%p=NX?fV` ztx7gBKxzUg#E#+gLaJ}0D(5ynmEv(32t-yIFF+s{IAKczIIyz_O^Ane?um$=9EKZu z3!Y~IzbXlZFSguTLT!8FF6a)fJcQpt+(nQRcw7`{AkyOrw?a^v%w4XvkR27u>EZCm z@3_is^#B#w&Py?CkEh!CoWuzYX72;F3@;gYTFZ4n8LuK0x~fHdgr(2`N925rZE@W+ zN`Z`YBSaM9$@e11fFIBX=b55FcgbVG|3jESBbpYzY~gv-RoP?(u8=qJd}HXzDxBh3 zG$C|jv1q}_kCu;lD}k>iBYjm;BM~l;u#I>FA6FZ*JT;9-+YE&pc}*HGG)=~nKtgn` zf*)~Beq?H6XY7IS;)Xa>eQxL-375<8%)YJiedb6bLToB0($2CI2lr6PvRYY6ig3)o z4yG+6aH`8ABM|lDFgB<%0ARWX@DsR<25E8tS{^49LeKcu82HD+VKoQv&CE4Ayps4a zMO3dS`{-8Tu-n1(g=eL7#>}{KUQG>VBr%hdHjb1 zif9Yo02#y7SyI!5>YVKZ0W1Qejw}@zJ@^J-W~SDoZ@6P2$8EBkALwFomJ=hUm~+xC zj6e;EK<`yly8i*xS!O%NQNZw4OzF^v#{weE{Lx$`>Vdlsoek6ngSuZMmf z7y-iq^~?SX8pUyaMwmbka7USYg`{T0%n${PMq*TTG_o+Fu^#>k_Tq44B<1dH_ zu?Ux2TL7Oqc~Ri_5RXU-Ve2YNyNC1-Vj&MS74mdI6yNMK5Y)bkk4ee#z@%IPw$w*&Z2CA=%jh#BKvfkO@S#r-(~5Ztj_uPTz&##nhy7?F zaVBC~f*wQiRDDcUevEL{+j6@krulGNWS5t~4e~+=Q+)#!(o*v!srTEQAG=Y~&LbJ$lmcbn&lX zY3!37hSS-^v7hM3nl!R&_#j}b!f%#Bc!~}HqWI*bfr9}Y6iG>7mgpsQB|=Y?c8Re= zkO9*fsc1!|q+*^|>V_*d(hO`OG=e5>#88B*yj&Q5mX&#g$z-{XCZH6vCzW6Yli3d~V6uP5T}@(H6~3O7<>IkH z3YK~?Ng)RUB0xqg=+M<)<0K~mZP>Cpn0|093>AXVivf$mP=6)SEYX{s2Np^PNj``n z!r&D>lqfjja1h;b8OhBDW<%9={M*HNN9IVW7XdoQP!UO3W!U$C5b~TTp2GBot{b*K z9tyWL!ZAXzu=r1qGp^GJ!6J!)hc(iKiLzCAwwUkNj`JTwOxC(ZDvH9Wg4|Y0)-wkn zmiUrLft~Pq$RJ}%&g{`1ZOO|`@!-SMUdoaY>qc5Da(XGytcGGkrKs&mMkpd@=K@ip z{%~k1n->C*Sgnd!;lS(0Tr#=R$VZX1Oc1HWB7q1&)+yNGD*-H44ZT3GqFl1WZAdiZ z2?o+k41cLdX@MljZ%pD|q?F8((pZ_PtI*TO5#xy*=IV9j>~opWjJsI`ro=F;3+B4& zV)c=|f8zM~Qm}eM_ND8vpbW*fPvIS!5dzH{gE{aF-CzqrCq_z1gRcc_fGQLYh=*!X@}qT!G^fv8ZfQjb z5ziOYnEN7@F|ZJdH-H_y+TCl~GAj&gb~FUz0qDb15x<=6Jf4!AoeTLEU( zb;6mLq*rt)O&UrN zmE+xWENXJmY_*Tt7q`Shd+m#p-45G6(Byr*Z=M6eE{~e$%KOXn_otm*W^LJOp=D4d z1#g7q0cq8NR%TdK7-biroa>BS6Ww!~aF6esBK`|Cu9Poj*+$O;p9rTb)V1l6X7?P; z48mll)cHCqWn<-q)?_ftc<*fmJ`0rMOGl>KH7!~^Z=>Z^3@pS!aIik$D~pny03$@& zQmRF)Wcj!aS4tV!M&B~~cyMWDHCXLljihpe%+FMQUuKR1=JYMIOAZ|Y*T;NBux=rS z^l=A*N2}xM^1-xc#C%{2~ zWlIU@z_6SyF39mtg@(qQ8^Dd}YL~5?Iu>}5a)=_W1S^0qBQ9QF=9bz zUL3g@8fr->t_SG4N5wV1SeU!qCcIE>;5aM`N}0~cVmswr!Efssq)%4)8E350!X`0d zX;7~HX!}1HMjN-5gb6W*R!hLHI9-cpp~!D}gK7soUr*FFMS0=zl_@l65MUfQj~EHD zP%=Om;Zy23oFDCIu`OveB=EWUvWUv=SEH{{k%nrN;3ZEdTtx{rdYCDa*nsDRF=jG* zOh2Q*GkGW6^a9-IMi0Uj_6B&ydP?eCb%&&hgmWEWF%;*q>xQdkJadd&tEqMlPol0S z^Tyo?cQ(QaO%MYiP6KEDQQ}6)Z46*x47_`?gLXA-8yr1vzJCu*+Bffzgp@4+jXL4m z7v!yb_>4e#4Azq1=c3>Xt9%Z>#jk1CQNdut~S6G zYsL)WVj}JoSDHihGvHanO%`oitBBQZwFi?!Y=PI0^}^1XjyX5bV;6~U&Oy2qP(^ub zRo*SCEMtRUL*~lQ*o6pIP)jh|#&he!$2V;rqmteX*e&pXlrSaWbSaglM)G-r%T-^< z!nFOUe3SHR0GVDX;=X4&CVWF0b|dB6lG~qfML}+m<(|*!n+va;(1sP)w5&rtmJFH_}zeQh%#|LdFI&;Pv0 z&kyW?HQviS2KOD}?N^k_wM=lM-3fXhV~^(xj3F({h?ERnj7^R)KbVS+6&_p1!-YzR zN^0=l$ZZpaV%eLBm2& z9}{!>xU$M(UM%oo(kf$c)u%2TY6dW`_JJOIML7)*YG4a;`?gxq3eRj$d~`xMqQl$TZ2FADF0xFs^8`RC4N|$ z{3U*H#AQ{1Vs{m&)}uP{u!4Qc^*c+L&GHN?H$V1!Z>6gq@HP!g4Q{`Ry$7*};hH4t z7O$%B(A5I5cBYLY&UO?WtE2n|Der?OOWb6(WO%@08}U2U=-bT-J3N!|Fn&LWe6cQ5 z3cT_^D9gi+j1Ak_g?Q-H-o-K%NjPn1Pqi$5KyX{73#U7v>a;;x+xC#HnKtc7-sAJ& z&Zo>KsG!rHU)rd~jvUZ!InUqA*Tu!!fJtzy2jdVl%CW#qtcjPwRP6hcv1M%!4DCLp zb02f4#C5wJ^jf2rvhj3Egz!s0{q*LiiqEgZ=5$+Pn{r|;ZAUl$VAPB?|0CFD@<(^_ z2P*$R5Qcqu^9fm>*NUh1c#SE`@cC|IQ#aU(b&!q%%T?*){z2PujhDZJLFj*wk~dml zFe^IXX<=jJ*Z;3=uCL4be+~41qgriz*Z(i^!**ON|5k#VMphNNWeY;TJ=ZjB9k}%i z+vW3P+MQfK{`~6APd~js3@n~39^j-0-{PGup51|u0#Rbs^{IRmWUe=t?snrQJ;_pJ>otP|F>7Y*d zc3QdfwCSfdVDQ_3T!fuHL)bG(F=60^fCY3(g?lwZuK*|K;;0nuD+_PmW7*qBhkXUz zMv%n(2qUZt$I|L8(}oZwVB7$r@SA|`lI(+9JZU+}8hGy*%l{mG;Km+EG}y*!*0fbM z219^;svn7cD@R7pe?6eXB)FlBPcYUH#$xG|%$AH`QX$jj5b#wAR+cV?0%jD^^(`rBL0( zmCalUD?5W6)sdzZ(xr_fp(%?3CioRpQ&zwNMTFsUnk>Yo$-9nlxXfMA=PNOi*#B@^qQ3nTFEBe3BG0oz+D!h+Z^;s2ti4r1yjECaY5GPnNO1Y3QslAW^N0gwYqy59EE}|!# zAq1Dp_GTsKeWh?w!~#*>oN5C#9~RXoi3;-s>7h*60N?aDQu&4L z)cHT7>TIY!nZxlg{wU;YCCp9mGqG3_1UGfi(Lmg*W&4c1#pXlj(W6~exB)lcI&+C!Mog?vc$CG!O}ui3 zZ!wk>idg@^Ewv#^#nF1ccO)1f>SdPt*}yNlx+-8`H$(ppr8a(6{O_m5Wq+sSe>ZCN`er=;TVG$> z_@4iLiJv9hTFF;oetyL&08|*y3BF!t=F(eLmj3v|@c2^Bs`76UnBdBc@&zo=n>UK@ zSzwpn=_aeML6(aaME*eT`UBYPj~e)}e9PqWQd&wGH-OHTFU-#i#=xi)vgBVk!AF_B z70G7OK|tXw;}4pt3WD(q0u%e*rSDzw{TDeaB6Z3y+4%7QpR6ivMa5!9iIkjj4Vv-8 zj~?5cjo!dNe-s^y%&}LAWB->p3V$w^i7c9W>>J#Sq)ka+r^3|i-vYF-FJ!bx(PN^U zkIVn(-=eE8&^lNUKb((5P$*fM7 zYTgh)=6@xpbs3kn%WP4bp0h2Iq%FXNuWN$w1Om%3-)qip{OvCvi)pX6f|sZ=?WL(y zSC~zOs?xFV`SRrC$D&M(Tj7!U*o%dkm*5Zk{hRXRs^ScSSN@u!H#ypW;Xwa9bME;; zb>+zQ=U2<(e4er_eZTVj`RA!==V@XS7oC+@CXUHXrBVs*{*+`WGCA=xJ&!HHACX2W zsSQLboYk(d4B%9-=1+2G0iMiw1N^`J`1im6_S?Vz{p0T?Ae%Y)T>!M8Z-nj3m*0Q? z$3JA)z65`zs~-H3WlxF@CFK+CDOCyKk4M|C@KjQi?(uf`Lt9SEa>KhsH#zW!VE#Ps z=s_BJIsi$oseE!wd-=y7SA-jt3ZrE;xHj8@&lCnFaM@W=+Fj5S-Dp(T5rG`Jj_=SV(EtP{>mN*2 zS)%jMOJW26I|VPNtl*KyN|VliLvN&r-YNQ+PJ8;SI&;F)&vo%rmTyy5&tei!8jdvs zJNbLWiv?v6N=amF)DxI-g?CVk#=S1KA!fNM0f$;>8D9%azKMb3`avXh0H$5;UFn%FuVowl&U$B#faz-tUGfdRt zKf|xT2SamLOZnU1%p5Ke@i%9cU`FNng^}$Sk!63L#lk<|>R=hQGv8951VzAtk>x(J z6FGzDt?A`=egtoFt>e1tM4lqU-Y@(&STGp`mXVg%qD9L}73_y?n92=GFB$@Y&VB8t4Dha+pc%r)DfBuIPl+FDgQPmL#G!ZO^7U}=| zn|k;{PO*W-W}x0MZdS5trvjzv!y3 zzT@R!aOgL9vi4_mbT-yjjmcsC?&k2bdc8Gne{wz_Z66NR>n98THgD^D-fiQ`yS+Jo z(9HFJX_L0swoe}Po5N3cSBDSX#+i9)woQ2FbGLCdxvgJ)Zhsne+ryJVcmJf;-QTNr z8||@vaBSXm9?kA>&%e7lHcu^Ihj;wjo7SUxy>3Il8|_ct=Go<5>#XxMI=kO%sh4g1 zyrbT?J-vF~I=g7?omTPt&5P>ZA-s1;@9kOe-rn}nt`6-ky>l4Uzcs=mjDG^Z2Mo@8?-JTvcAhNw&Z0gWt(~J?i=K55 zUYf(n@zL%U!s`LNtqz~RJlC_y(-C}kB)*&8j=_yIIj$Z@=a2Zh+NJq-Og?`BQ%b)V z@ZCk{3Etg1f|f5 z_nlO}N51%1zceB*9M@;y*b-N5sakW=6R>hB1CpVpX7x@7WW3mg;u=ISxM*9BW~a({(3 zPRJqhx*6Dq%e~Vpi8s$lAGN_Qo^ZZF{dNvxSvy?!!27j-aa(aL^>d3lIOHAFXHPP& zP(Hmg^Knhc1>oQY;3NAiaE<&0`Ve*QO`xl;`d*jpv_`UZz5V249{~3`z_@!{ZRgri z^2a;ej)wXd`6HkY(CvMf{6qBj{5|fU>>ceK?gMTo=bxBA2EWfqZ)L;@mzEQ!@m1h2 zU)@LB!x$G}JJNihqdlY<Y%ssS3Nuc_^ya z$S1ft+{O41?Q18rub}Jqp3WG)Z)h%8ES|e!a)Ww0#}_;aaMUqnoW8|5Gky(x@4oE& zzZWpg!V9;Pa=f4=cp)tonX2a{dmZJO*t-%R9qy#^5x1?=`6x0zmpK@}G1y@~VX8eN z+N!(lgdg7B1$-mUfG5sSXIxzYPxuGq-&DDe3FF^(NQQ4j%z*m&O5kbVXZnrw!zKA% z3+d%&mpr9iCoBlXy0gU$M`q`UsR4FvXUkPX|h7L z{36ZIO~)(3`zYHardy@Bqmz{NTc!^m&&((eIX^`69*oCxWIaO5$lPPJlygd{`i~B&gFWS>&3XAXpzm1jvc{u1fDcq6`6ZXKXY0qX(GqKjq|;TO-Sc6 z=C78e1()F*T4eLfb`HO!+pV~$$jd;yX6C@WzsGz(7MtCXyqj`< zCYTTSg(oWMwafH)=$6@ltbEC1G+**IhWD!=*L=?S<&Nor(N1cvGa6?``HS&Onl0w> zHt{Bp7moAdqCw~@dEW6o$k@eUTrbIeCT(tgv@dWL^&!(@JVuM0m=5Xb<>>?RA8O51 zeV=C65C_NcxGx8elsp;vtLpu+@KBdKEvH`k*$PC4F-_rZLHG@0RemUIZ$7ePD` z=BLgN0DhZtPSxYc`psE=Ypm~IjrHyJ#`UEAa5QOEwffVjYoBf0?OUI3uMfSutEaJg zU3=^{4y)}0uYb{KS=w-~ifc$m+pX){>!;dX=dpibU-`Ggs|kE}cy1q#?ylGGy9f9E zUZ*wGhFgAnTW@OhlLu}8@U}{k!_s!`=Sj`dw#Te%926S5^Jya18La+WY!Lw|;IK*O&d< z;gbdP7eZt-a8o>falwrLrbq; zdEIRpjxGMT{5;mLU5n%Y0B}llz5|@XZ@>f4aDTnly*{)w`*_USLEpoxHEn-uqHni= zZ_eSJyTNV!vfsHn8~|P)x|jT&dmZo$d`IhxtxYjkF($`B|1!iGyuVdd_kk`4ysu7c ztY6nm-~}0P{j&p@*TL1KYajQ|I<3hq@?O2#?+TujaCKDUe-lrfIlo>wK|A1+E%=u` zCy6I6IZn>&@cHI&phNoz|K!g9G09&5V-I8v<|TLx=nC(_+%y0~ z-|y=O`a^qv>k;9AF+ZpAJ;*ZBdvM!0<8lPJ8d_uEiFH|~Zi!C>>h^_#XJ|$pQKw-(BBTkFEzWr?b9Rx9;ycFc;tlq;Kkb2Z#7x zN4?e^eY@shyY|7!=x+Z~;B9=jm&OYx4_*7Ds@YeckdD6s&Tp@Qc0-sO!t&YaUk&#> z{rb{t%g=DU@YzVh1O3w)S3r|C@R<0%#rTW;?c7~IdEH4r`5u=6(3x%42Kc1|@&NzZ z`zW(}6GPzQ=6uwxuZ`P#x&wb}H{1H>_JQ@FgTACS_=~spshH6C&x zcP<*3FF*q`p9X1mGDn6Ey7jI5TideGpFq1H;e2rTITiMZt<33rKWqo{owU}wjZ47W z)+ZkJ>91*nopHhMYP5In!Dp!UabFnV;=aARZr#ZfLC`uju=4G2Z+H`T>2{5#R#+w{r_VstA^ue<%LPk?8}Cl>Hj<9w*z3?RO5ZngKk{$ZoGb#qny z+j~>%-(2{yd9-YVm+R1^Zb{b%5xF?BneIM~!YBCw&6F5b#N6cfMdj?^9DMLIK2}0b z#~?GGF?IqRCveo>t<^M)&4!l|`-Aws1%DE7HBoQwfM>w&?(cnunDFyaLXNf~aLX|t z#$gbzj=7)t2%n)3!272le%XxAJJ$vY8xDHlw%+gmdcgg)s0=3j9O>Oppiiu9eX=ge zF7gNWCBdgOuAi)l1UfECzor}DAXDzv z|J4PX_UpE0hcRmcMu6#VfHrT+T&n89;e$SD0nWAl`OV>^+h{wt;A^V&^#>hfLhuU2 z=tR>~+3%0w@M`OJ`#z2Twxas6mgdW++um$DR>WR$JJEW$GvhkE1+n+}qYiq2e1&ZO z&e!$(K@Q5o{FK~J3XjG7pipmt-^S!*Tjcw+sQjC8{mlMd0PNlCJ@07mDXy!y4RQK1 zUn32f9L02Ed|r%hyP^F!kKmzqRW9}cIT`3Ux9i&H_I|C_Jvbj>o=W)Tz|+~ei@lRt zw!>m-k?XZdR6%V_(16V&zS189vaKQ#x5c`N(;a}Xn4`FeY&+P|(mUbXw zoIAOH%*A`cerYJT;4c~wpB+Nn#NxYFUA^Az-)tWaw1bvsK&*v+0m!L!dwsUi-X9J0 z;qDl06Y#)#i}Lg~`Br-x_@x@ynY)84uxr*Q7K5EY?0%IIOQyuf`MEUm1)_YN>;v=& z(!QqI?Tz*x;}66)#Fh~6@SKU+e~jxslH=`xhhq?3w^8mz9)!^_!#;ij+cOErz+BmY zzJoaA5n_;Pe5`=~WA@;-aW&CCMdr@uFZ2`G@%;htJ?Ni$%+Jru-|dO^VN84*@r@(C zvX#gMWUWc;o?t$J)(^m6JnJ@ejGZGn%kjcs`%v z9_06H;l~F0VLdJGAs-F&st)lE+A7&+x*hI)zPrfE1H;&}=YdmsH_V&F_zHBJ&iM-3 zMDiBk`;)B|YjMBs?8bbW))3~^|CRMILcToS@%n0~`BwM_K<7r_7f+h*ul4(MACAdU zIA)krbBI^XN8!Vm=;tkx&%qBOKGHECGhuT&i=JOg;dcwyIwyA!Ljz8CaP1L%7+SZX z{($cT8wzca_n{4=!NuE+VC^f&L(~Swz6G&=EwxP|PrSR^kDjq>H9&uSQnyw>*(jh9IXw(&sv1escV|?93;rl)}!_rXt67wOFTTI?3$BuGsHavEtZ4rq|zyf`I&qRU3rzmQ@efe zKOdP6Z^dl~^X19^M!9&5o=#3~Z-5R5UjMqj z^(d{E>k)tLpo%(hGm@iBo6G)|&GK-2xK@yoCrtQ;BG;45tMm6Ru+Px906OfgzvuLS zALHrxIyt3N9m&<2)6n&^0L@dahuewne+vkt#Lc}2Jpn!>ko5q13u9K=?$^A zPd+o*d$KWy5dQ>uo_t#FlYhn6q{4OmWZs#}66jG`$NjpkgS|h)95LCnGkE@MMD8AA zz9Jv1b3aPA?FpGV5xHWO`6QS_O40YY{<@pLe<9=#px>jz@e|r0GokBvjsS2J$X^JCN2c@lc!YVDTtqAVUjKGE1(S{3vn%yAFb zD?Z)UuO4-#PioyE#p)ERVJw^BLj?HN!G?lfJq!9ppN{Qscq_|A8~lJv;J;kGwioV6 z0$imx*~ zGy|FAzngy(c0jUO>9G#9({N3c=>wL}FbC0f@$K_XrXQ}h(7y&gwC*r3mSSVW{SNSq z+w0zSGajoY)*)E_;%S8I1n)c1_2kfJX>|eb`e_;uT+_Q5@m$a^vwa|!w>S51IbQzu zYkK}Q7Y6c8;JLn&8~b_c%}MphZq>AUKhUvBf1J}w_VcPw4|kLGNB!o+5w;-1?+x-W zX>0BTk5$|H+Sg+I*Zf58e{t|ic-7X77rg&_t+BRVP2B&oxl#Lm|I17Kym|9R`MYcM z4A%g<*Y!rM=^fyB6N`BHj1AsvJ-D zOxN=}RF!a5VTH_A754es^arQ5H94iStg7Yl3&*G3G9G{;)m>c8yq-Giw%^t8nhh~t zMY{MX9EaD~6c^Pbp~41O$~tzL99<*Xw5$unBw~%1zB-=Z2T|>h-v)W>j9vNbT9rSz z7?@t$+sBHL^mQ$~nmaNOs~#*3)5Lnl%_Y`L3qQ2@hi&|@y(HhFh!>nubxU5%-3x1} zVVO@VlZ(^9Dv~%hyA~8tP@yuXp5gn3>#?G{52|JAs&Bla%OB|SQC|0#>c`_nq&-n6 z&d{(g?3)U3vYKUdm%yXxMK6Vq-9*h1%V#Sty6QTPCDlyCkA@nQVS6XOh~AFHDoabR zu`j~6c^Vs+e=El3AB&A2={|tLl*z%%lmD-%$N9e;vC=hg(t9!3rd8?|y{?4N z!`H=NUk>01AY;!~BGYlW77nz~Ki^48CCV3u9jQ!;A45Q7mG^T{bdg=eCpElE-eruB zj}3p|1Q#HN0IWozNhm?46%IS>;<6*ao~v3H&I#b}L0sF*$}{q3cvW6T^KI;_>=^V? zppBeSGp;tAQ7h#_(<{R@d;F?FCecb@gz?r%8?R#?;kC;;)*;8+!ZgRS3~kyirVPk) zqvy5l?eL9cHDbARrw8VPSK(!a+9Sm?J!bh?p+@#RxKVQ@^Zv`+{@JY|ps3OY0{#w$ z$z*T2Lhg!;;8d)fk8Lc(jSRXyFtmFV*#t%|5!t?@JTThOFJ8M5p$}_%4~bco;Le#? z`C58PUJjS7rf9efuhayvtJpzZOo=`<{>jWiy z>lFL^C+XhcoeZpsm$${55qTL-Fl;z*Y}v&r#G6w&_; z#Sax(+MVqJW$dQ-;O4sUECoXk!oJ#YviA;I7&OOcnCB67~4tQYB#JZ-KuSjVUpmsk%= zii(&J&rMs0cti6sj$*~@`IQz%aQCEXKREZ`rYR2$d;HZ38^^@z;7d9NW(JZCAzMJvsg!-*rIoa+dNy^Ql&6JY;;K!K0}f3Ga9SW-9p>ct@SI#`63^b;UXcWnw%PSCE~w zccus%li>@O=^GR8(Gc&^x$1d-Tg3s@E4C$IN=6lDQ3>|j_>Q3Z6Jat01*Di}2 z9^ZukL^_m{AN=BvF6MG7#40;)~U+@2C@6F%S zNRma-^K<_djAp)P`;J>?k!)i>-MIn*0tsZcVwp3qyQo5dC>B#JfcFH!DKce_AU3;X;(dby{yMGpe z0r3yXVWTTQ=>20YwcAPPz}%Gh$B8Ci^r902qUbzg^`6<370%cqYHL9k^RogiZYrb= zyPM+?|NTk*@HCT{VV@7J5{IB8ZD`i2CN1!5N{F~(au;um3ojFvgZHALs>sM1owMkV zRUtv|?23UMYAQ`yg_Xh7T96jeAS!s%loUD^6D6ObVh0i(1e_+M4mJ;&H;NjBolyr< zSXb(xvY@{_eYgU0xG&#!8xPmxVsUh{ZTmz2#M!|%^(kt^@MaR%n(ZS`U>2cHsOw!+ zr<%Luovy>_IHl->){KDwHId^A1Rhriu5lwDx>QH2p{*Nc{n2pUeSUuZ24xW%H#Yqy z@!B8qyRku_zoAAAYiz$woS&bQPZm>qAG+A42o~iIfyP_ABBl+^a`x)=Ps>!`llW7O`7~oZG zi~w+B7ePc#1O%a#AY2jUiefq}8;|NCY&=x#7=bI`9M^4I7?%=olPDFvR7XLTi1I92 zqD8bdVS~NkP8>?AS{O^roZbN)q6u+39KOZ7sOUe4(n`Dpps8;Bp$OhFXDb!pGrE6iWDg`ZE&Jz?slzPXN1{i}i69_(O+5wp{^y_R zP(S~S`pkBM_Y$Euf`dbD6b1eDjebcUQ5<}B1^JMh9dsZT&_s7i0EDJ_P&Dv8oKrST zopvluJ@{v|&tVPx=!B%OA`io2R~46GPn7R29D47&Px@z`9t{!XvOaR{B)hebTu%v8 zK+G-BG@_Oj{7|I0!ohSNr00~~+_J{Eu9~KLck&4DDqwimu zzf_eLth1jc1OjLHj}uTiB9@B^6#w9Vg`4|Qb9D-Q&`+FhKg(~yfFOvW?^JbG#{p^h zfWlSNH=}Gsduum_{%{3)U}v!st~q-ExU!wKDq3xF->&+MZ9CdS0BEW`+OLP|6TB>4 zf3kMQ+M}_p$#(*{_6TPkdIaX=MjL?LYpy*cDAJ#)zlWX@D!>bot4g zs72bd;ZA$7@ics}G&tkNu0LF?N&1TR7?yP6sL$wbr#{15skP0P z!=vM#zdh_fbE5#6Ys1*S{yQv7Z0^jL9_{RjE^)%b#Vixd0ziMDk>1eLImp2K@5bmI56LXO8Jpy}8eX^enJ&AY>c1&AJ`cW))IT~w>0uN9@5Ls*g6>c4E>E||c*BiPw!zD=h z;oRA?VYl=SQ|4_8Jlg2L20a?EGL+I7h;e`^dl+-scr3dFwH(wEG0_tR(A>3GZo-=k zR`zNi=e>sZP1gLLwl+E0Y;r|0S$aSPy&4l>^M;An{O9@ldHsemAj+!6#`pGthR=OY zXT+)hR&??gH3s|WH;6~hQ=*3y$Kfz6hBpu`KFjC`zCK~#M6*}RM-Ja)awI}4mOX#` zlHP@Xz63#t_i4X=L;ZlnE4lE`=(5oD3VQ*md&mF6KK?`&rP4g-4??4(*NAj^{sa?q zR{Q08amKnwO5y3RKnY_zefgfcn(0&wn0arfT|1r3USzVF)G+%obMfe;($3@Xaxl2~ zFc`R5dw7w#_?Wdb$q(uG+4t$e<%jo=7sE_8n;BjvwJb2!u>&BQ?3;2|kB6Z;EQToj39%GKuj5|As+f-p4- zXQ}x1c8DJ^L)G+=BsbZ_lu4zNIH|zLN8~R_{}MSVrb!10E8@%Yyv84*+g6V)1#3fC zSF*|!&niAJ+H-mOI<2?JsiA6n>$3P*TcO`X7e) zx{*H8NfKUT_Mf;+8#p}zII%w5&=|V8J^xWm#HTX4eN0xH~C~7 zJ0?G)wh-x4U#LZ^AD>`<(}n+Rdc^@!Uefj!S4R!UC6ughy^S-r=OYf1+7c{w%a{!$ zWC$g3qTEVsF_C2>SJv&#dND&28_gveF4_2~gxg}4l20~z2No;FK$g=(=k7HhMKTji z4EsC8B*{ii{c;YT7#hAdck?!?3qbFSC#RB$?9_f^R+tnFsCjvD?sAN(zz_d*m<9^l zA$s>0o6(qfHl)$Upb!cPMFD=Bn2=LQ?!^DPvBBt`U_uY-l7k_o2G<58(tQV>IW`(e z_|1F_rqo*GdPu`i`eX4q@qI)BNPvMBeAWcGJr{U0H@pVL&_)9>h!mfKEE1-$bYa7A zL-*E?7oP%kz*&sYC4_ko`!k|3&%??=H2D)j(%`*d!nn^h11_fM#_?-qUP|U<4*sYy8Q5oc=6Dm257{P&zg|FixWE&TI^X|B9`aT zMaT_X^xJE{%|GNS9+6R){VU$YhXxQoApUY>y)9WoV`i%s)usG<&=o(Hog$%7{OaSz5@ z&i2q>?iPVx0rkz{YCCZhOH;|b;^!67qIZ@XJU_O^d`B7!Mt8&7_NT(ex9|ujgZZsU zbc69{2v=gi*sKyOWC-kUD>WuoH+DB0&K9dZ$#9+Fho5-Y=vH`rp1w?M^IzI;5UbB**KZR9 zp7;2FAMpP^20f;e7atR^)5m+v4cEIN>{iepS@RThhg6Xwf5EOzXrFg`k<0?NE>7?E zBkMMkjOjKY3)}@6fx0BBnM|rmL_9)yKg|&b_Zjc+vA;mz#ook)`AKoD>wCdkk zZvGMJ7eflQXPD5O03nvBPI7PP0V^`gC^}Up@`%n`oCe=@2qJ(~L2LHc#L>B!i>UbH z0<&mve&0ald|XcK$Wb9m=Z!QnR#p)|6tt!=hSo`#mLvO7_(SXFC_P8^s<4dK>uEF{ zJ#m?LBD#*J>&UJZ{`o_xA67x3eoDze*YP}nu_M^CKu{Bz&ogJ1=wqY@5Ycm&7*OfI zO4#eQ?TqPhMMAF(UObL~8^U=azgXeEvOsMTUA*c5Gw51!?uMrEF{$z}|N0Aj{Ex`| z)|-HdcH<#Q%fV?}OVhwTERo~W;5kcVkDCwIKf*o-U`0WN(MAO>8g!NRMfANXdCl?A zDX3$6sQ?NTipdByL7R<}D1S-Vt_x`OBN0cU?*fSarC}I!A2N!>S7c1oVSbRK2E=TVKvSW10&AX|KtKOn zU~ka}L(J2ke|{T4ZDW%%vsS&mNwX!_w%_e4wXF+=-L2_w{IquJC_AI0A|4$$QB^BEz89`A{9 zzp!fb7H?!qUci3K>6M4s0{aXF?RH`l`u^#p%Swf6h=rrrAbkpMRkKgmX&w;-DpEQP7poe)?(X)2QFs+r%&2U5EQ};#Uv_ z@7^WWKG?A9PwvD=ru%`&4#HhOVX*cmAhVxRQdy-lQ?aKr=!$;$=*w*%{ou{gUXSH> z_&a#JP`+D8-_dZh{FcSTMT^aP;;As=li>Y;re(;rp`>6mefdhXUa!!!cB=wRBap-M*zV-T8W(d>*Sf<&CGF9+WmJ#QY z#F0}oM!*GH#W;nAc}9Xlw{i!*p#wshaxas|#A{?MU^f2pFIRvH_TekJEu9MT9?~B@ za`cMEm_+kn(!WNt)>a1<=jtnE?joluF`PbGt%sB6O20dGs=RgNOjVI!oU2-$FLJJ- zs(!&-wH{8MEB)@&x$@SLb5%u{ajtS%!N{3vr3iz0Dqn|Y35?C{Xwa9PDb|d5^cFj6 zPQQD9k@=YZ@a{wAL-z86f*Ph#V%GeE#75T(y7Qf5I9|cnKUpC(l(+vn6>$jmr^Kto z-`SS-clbAsbA^x8b%{oXnLW2Rf2%@Ku)0~!XM%vJa(mS#F8QM=}1$>*f`c$ z+Thiu0UACl&zajc+&HvM^U_;=vgi3+a2;EV*{FzzFXN#(quLCv5M+^#K6Sv zS@JObmO7i?akJz_l|aLIR0)^W^L#}zc3-^>y~~mKSU>>b1&9LYDhklg@$-4 zxH7E{U%2BHV)bgLQRrn#5J8PPY5pcn-=xEDGW1QxK#?)GFsEf6Tb#SQdOrv-$%FV$0Va z>yv+c#aj_qa9o+)z&9M%N_G~<_eQDyu6sNjGXkz*a^+_-!*?@YW~VN z)++yo@r@#pzg|oeSN~hrNrvk(AMQ1D5NaUA1*iCPL?`qmnQUa?WD`zV%n-eYfc$7M zxeWYwW#UTCu+hbeqeChfHT;p(T@!&JbqA0N45OqZ`D?ak3YU_d8{kKM0Mdo28n7n60T2=4!VD$!{$imFTG8nB%$|~9*NT?5;uSIJ(RLuxSH9d6 zAa0AYk?MV5ieDo+pV?>Pq=pabDWP&64)ccd5sV7&|92wA3r%tOZP{8PE2EW>jxg)h zTF@X!b&ri+aQfSN@=ZNGhZG65k7t8`)+$_o3oKgsYZG5%I;x_T#+JMeO+%&ZkRvRv z8g|5lq#jK@h09<^^rLf%vM)&VjpCLDY`L!F3yM%`YMVxSMXR0h&R*$+pmtzJVFW*h za2Z*nJJjRiSXU7RydyBFbfA=@=*-N8%=NjU z4};n`)baA>TW1L!oi8{3_;tk0jNWr2YM5qmjv*-cPx_Eem$nCEnRAqS)msijjn! ztyGz(W6}!pCNn~Yn$`0#h|=9+<+-oIK&oS1>4oi1FF|h@^ykI+ZQ^gg@D}F`x?g_| zgQ1LYr40D_kE~)JSGL|*k3J-B#T%H$NG)jpt60gPM16#K7hj&Ug~tP3ie6@@W`DG^ z#MKo6DvW=9##cHHB7F5Hl)XO|cpy~qDM8JeSLK8~d+@ zMs%ZvLFS}@GyUY^C7}=nOQG0;{FbBnh2{JW)780-Bn#YQ^m+(Z?VcPOvlH%WGN1m% zAQ!>_T!n!W(Ejmt=uI=m=jXOsT_y&U?_HJN01|t1F5glR0ok8Wqdpp7-FWlm`t-+{ zi=Qk`eF7bx|C^LjlKauPi#N=Ck`ES{`Aa3ZE0q8_RUWS&uN8$4tNMc{=p6oE#z#;Z zK1!n>Je{jGDZ;wCTtVJ6?73FFBAkU_8d3T{w(8&!Z`!M92XFuO3pV)mFF(r=%jNr{e7i52rKuWy@Jbx_RYoIu zl4LAV_}&=f6>pj6h^^b}S1e=CoGB^KMf6~vPkgm}9ryBd07)S-k-^R#(>tfPAiN^W_)1v$$8SH7x{z->2z?)U%YoDZz10B2%G@Gko)XkLc_a0T0D3s= zbAsglVNC^k=oj~BB87mDeR_16)M<4XJVaX9Dkg!Z_Tl_|HZjQi@t$-GD5E%MX;S175LQc_^+wP@mEg~-hiMz zBK70dXXFk9^${(2u0Er;An4Cn6?EmXxCcRf%2rc*s6C+N(A7ueE(G-vzYIZn%5FnY zpV8|O!p|hv40}p1L{OhCbkxu*5tK(*PhEW=U5cQ;ScKMCz7|1y5pF69VJgq*%?QdP zel>#n5bs7%pODKDltsp8GZ2I{z6lUpS;n8|Ahyv7;`)YJ6SPwr%eHo#lV)(L=n^(GwZB%O(4d6D^S zzx(A02JdxHAAvMEX@1g7h<~4q{3>En-|b!olDr|VWH3!e={5qK|3McuglKYX`&f{J zwmPSEh;QN9>sJ(3*)I#)ce@+}k*kVNG39GU3V5lqmO_YehDI=j)mXz@NYt#hw$?=Kh7g)-2J&c(cSI@&&Gnm|eY}@7TKh^(7PC;vT zR2V18dU0WK zDK}C?u&&f1`rG)E+S)LNUQRplZM;=O_}-4)ig5z6c+>DQn^)w@yi%Y4nCmva^?r>o z9jOue(1jNv%&F}YR|!*=g3?;eK!`~(h`W&^7BE@Ty%Z%!$BE(llhJ%>xE%@zS) zIBKUA%qWm*a>ykBoA4}5?2liyuK)WbIk1SHZ$jjg)*_BwXa=BcfJaf+z z<)9Rv=!ayPjTUQK`=io)sIl@>SjaJ=zK{`e)72gNJjlay;{_VO)9fbm#F=rtv)GAK z=wtHkX*R-Dg3jpWH-4z3NYe_~VJ$>N<^^PU_VUrss7qptjzsuGWIenT7XtQwrvCL! zY=rdpV(4)&%3or*mjKR!57C#zXha(+SH4wlh!az1hF;I~snHtcU_8bOf{|dt$?*1w~q=>MZU>1aM z3ZycKG?I;RV+o(XsoMS@TV9`*PGn=52na+xBK;hCJP!s4uR#FtRRH|wA25yQuL&Cd zsnRP=+Ku}w3?_V%E>C%fr4K)&H~;;`+u^>F?sqE(yOZ6NpB9Jvd}U^Lo;~>Yq?gXF zoznBN*SUP^H!r_Bu;G>GwXNH&JoT;0c95x09wy}pd~+CNtbH$S9m-G3L3vi&4!Swt z?i4q@bbI68Rwv!&ZZen^*ZppF^5Csq_-5Vf=5}`Hat{5zFF*Mo>g{5#-h5uxr^TGz zF5~YTds_D0WFyyZjq?vlcz^Kn_qSdi-d)z8*13AS_P##ZrSY5Elzvl7mi=M7lB;(; z`b}n;zb|<=@NQW@kZ-=$_q!Dxr;6X)+S97vg7I6;=P&U4%YDIxc8=eI?_2w4{PyO) zl)`b>^$Gi3s6iY0eJv@zZ@}*c|Gu9DIIOB)M>zJ+MR-?a-}!B5-)@HbDh>-(zX|U; z&F6l-?e%aD&1v1YlKfe*|B&=xUb+1JO}_xYyY&0Q2l(!$lYd?};QK+lOvi1lD=_B` z;Azz;6mu4xPmbUw-IHKjcJGVOuQl}>IM(EOi#UQY@1ebYU&`YA`}akFr`spEZM5qg zR?7e@JS$oR*7P&1TQN^@8^GGmKR@FbEddj>O3o{cV?oovhxY}*O}j14r}!1-Oz57@r{MS71phey zak#yg9{`P$HSV~13P(ExNBscrD9=67u`A)R+kOh>bBXvK0N*1%dMcmc9Bv%oZ zrsFl&hQ6#F%p+JAt4`?()(-o1fyec=uODiK`&$cPT!CD``Ocva!}x7=zMXZ!FqaH` z8>|iBiSr}l(Qd%&Rpg(``XpPBeqS`F4&ldU^Vx&89)S^foXIgpCrtjpvo@a#^4$UG zIOq%Mn6@tgoSim@0cF7xojbtCXpZzRWEt|8FSoyE{6W{awFVhhh27)12JdRT4;i=G zm<-=Flz9~I$vU4WZC_OQfsPr><))e}b3DVGQUyL{59x*AzBXk%qV-F8B>1+P;_@GH z#^oQhf1-3saf@^5wXk2(p5Yz)PpWv4+QZ!0-a+W%LkIUVkl}1!VSOmLRmNm6wur2! z^epD7(vLxok@a`w^{)l%56?Q3j{AAOKbrat@Lg-m__kDh?3gNc6yyAT*xK+nwJee%s45oBWVxFu$?p;E5%lM}2pOM$U6|6tqmytG8 zi{Hj?D$nCwx}@I>$ljXEO3PRs7(ODGz9wO+sE9fjWGSja_M^yh@M$oS$GbxSD!}R*yWuYvCWLjF# zv1>XlDSCRCmWmOwuqf8NXQm~lmqzV9k}QO|^b}fZQ(2fSt9y_-&o6-vtXaRs{AA0iXiR9A=fHTP+ve{7!y`e$oT-vv4e+8Fei!sn_EfVvClU0knG z;2KkXm%@+hU>C$15nL#H%wdgo!p(3hbbA8BL)ry>vQ~+e2}wzp)Ye3n5%#oBXt0$x z>MX+6ZZli^*cx#iNzv7*EqbG^o6H9UK0c1HWej>6!octheb?^Lo_uI83$X9y!S=YL z_PfP(XJYR+CcAwD=24yY$nR>h=RXwsXseW%&!EI?&u8W{*u(l!`Aclr9^n<>#T4Sh z1vr~*?Ff&Oy{OjaHWaRFGtXhCI=r-gQ-!Xm4RlL%*R(7LY7fHZhjnTqTviU|nFD)1 zd&6yO3fC@4{2K)VS8mAkmL|2Y?}Z&F*^X3S$mNM0i?Aex-7l}xja!iMO??8*Lfs!E ztz08X{Sl2DVmB9cyP4QiT`N!R`|-`gVGXj$x+TApBW{i6=}Ez3<^HAu?+g3Duf}{(lz%EzZc;wOwYMmalZ~c=69RK9fBYHJ zy`{**q+crlEw>tZf#0O8a|L7fn%uU}5*}c*$oi-2Kxw?E?BUdA-5q~M{9kohU#Q)K z)dl!T2l#QhuL<=7|`>+fhOe=-^(z;OZz*-0yO8K}ttq|XekmI2I=M8dUI;56O}cwr&Wx54=w_ZTJ*?quDgMRnFoAs3R+Z*qb3RR#K5 z0c`jBeE3?@`BbF&WM!X1k?0N-Uh1Pt(|xHY)>HDQkv*V~YY;UTs^_G~`DlDpx!xGn z2j`LJM&3BztvX+i`iNxyvDydn-s%^K-XgyzeOnhyR*l*G5T+dLyL4Y`O0XGxgY`@! z(9e?Gx7_dFm)sk!*Ec%jyyW8z_MVWFdRQ5*Vvx&p*Qsh?HbW9Eck9P75;0S zZ&mXDcKVyLr=m+L#Rg*{L(nQsWFsf0OGys!q*x zIqK_FWQ8hk6XM3&kkW?kf0A`Sbx*1Yx+J!mqPvA*qw;tk@^2}A zxxoJEPgGk(>SGeSZyM|wDhKLZFMI($YRURuf%gOY`5%(mTr=qqSs&{*(c{8S;4-DiG%_;y(*c0@J!4s0N|(5CUePBtGUx2(=H(5{ELUs73K z`wH)$v7JNr>>~Q;agFL6MxCxL%a?g$IJItN->7Bw2go*|Mo+<7VLZg-Bj9$P*jr3K zYB|27#TX?%@iji-eatzIC0b}v|9&waH=*eAjLKI6tBk^STUTUN5tMO?Ij(GZlXq zlXZ%WF#6RQ{#d_?UoA4;sI3c)S!z0+ye`zov&{4OB$I9OT*w;qWA!V-&vTQ^u>+Z- z_)S#*pe6GI`OckIH9v|;4x02<#gC=zD^eUc74WM`r%~3G#g-!X57`&J4}8(lYpCSs zsQ#X?uY>sw0w22K8(})93AQkOnf4`Z{O~@k##;6LE9BQ_a_sAWA6`=EO_i<5P>eMk zyH77~ej9Iu@(`#VvCl@>HirE}>pv9{P$ ztNId|Z5xUaRBl4JLf?KV3vE2^^9K8E4eRIL65oAt#C`KLpM~@@&NH75^|f?7N>`nw zk{4y=rMPa_rFu;_SJ3!Qicy^s|4?$Q!v1TD`?RiGsWDud%S82x{*5{Bgw8{WrSRR7P8@7r|FJvnw!HpMPfnXucTE?Gt2d6N1cO)(9ITMVVnA<++hDxc+zB})7V#JyroF_w2yXevEH$?cuNo$DjxRqk0Oio0`lF3|$Q&or8V>(

OvRvMhYjifmwQWIsuuN5=Svs7)=y$ovSzW(nk7SG7N!2pig9zwj6ylMj^Ugx?tV zJLF3_XN~DsbRWA^#%+b2~!hQkKMYoKe=9BX3Ru)U!o<$7~EJl2P7qjXvBa0HA(7fK_K_LB|R zpD2&E1NkrfkVH?L>Nd73$^TlQd&+dg^XTQhN%ava^r6HMLOG|kbf8BG`0r4c10A!X z>v9qv+fp7o#+?*?V{%!^RcDWo?nq>UHEM?nw4-!<0y20rTQ_6XA7Gq2kRf?i?nyLEz@B53GK@oeiT^M z_(wn^gFwEs93UmPLAHVO8lThiB1FcRb@4d+tBJ9^X_WktaxYuL=c@K?(7&bJu&;W1 zHP1}SgWs!tgzVr$O}B$zmJ@elmi=npWU%jaTFeg~n0zRd0U#?VSKB^ z28r+1#&Z|MS6wyAUA8vtycEqRvkN_T9;cwf$$Y(r7!HkFcT!YepVluM6JjTA8wIhC zqpSv9xlYD#3r1Tb_dsl=Lb~Zu9VD>*bo*Y-5us>OnWtp>w6@R_&fAR^={JN;^h8yPjv&4)UDJy_nPAy0|v8sS)4JZ_2Z(_%3x9q-70bY2||4th?D z?{_D!Nz58Yj}_Bjpkww=U*kB~$$q89;*Y}4VoW%eeR6*>^5Wb2qdI^VXFAFY-!>N6 zTUnm&>0^D<8XNIc1HFjY`j>d#^#S^NC@giIY)#H3GJD;bmSvk*&POb^m3>Xl$Fb_l z{x0dW4Qs^r{7`?Ehy{fD>+roZ++Q!QKPhKk>2IR=#+CkJ=PTI{N`GzTJfPB_h=Ydu z3;Z3S{_HsTq}Z7{-@L3hD*g3DK4_@F>p1vg*7uwG`?mE6>=1Q5@^R}CO)oLi26>7#CK9CE*n&r{1W(1SYE-CIKRhyd5R7m@`VlzXAzLs2gydR z*^bYR7dd9^d<^EKwdmP%rn4)4Sjq0W%xn6*67P&T%V*Ne)22%_MRW z(U;*eU&fTj*&0+YRq_y&b(ZNuo1?yd#o<);HKU&l6WP@M6_<%A3zN=B6S*oDe zry|z4yFi>hu=6&UH%#*T=(5+2q|Ekxf(PBYNVpiSv(xywYW`b)E}UPC80$ zl3}}S^f4>@r!+q1Ob2U0d9Oj}s-J7<`2)e(NyLLs^QhK+rdN4fzHqvh#u?jkjIy)L zTT1?Ka3(>{k1(9&uYit8>oqYtb0W^FM$v_>#)fN>PRP#$o8qN%zM8ooEv8R%19*JG zi^zYA(ocdjv_VYpInU@~C1QdRI;Y)kApQ#^H}+60&>Wd8&51#|Mq*{Oo&d|q$e|yS z>Z(+}_VW_o(pWOm52*vyr~B_rj?GdZn|datRnX&ziazngWHQs~ESg_R^V^Hsp14Gx zsokz?`KFY%O?45djCLg2_K2Km7tls`b1j;WHK%a`gI=QK%E&cp0=?A^cn#y@D|Id` z`VLu*NLoz_Jq*U1RO7-6`eFu0gY#NzPu{2Ch@brF)o)0hL@&^+)p%f+l{{$gnB z`a-v6Iu+9g8@$sA-T$5q2CQ@9(qkciYhpRGJ)+f7q{UFKjV5k*D;?yy< zf>KxmZQaPLu^1^9E^471sXMY@wm?;u|E;E|FDK98lGU_$ZkX}J_p?YmSA&{yhVOS5 zIRA%2+Y~F&a?+G>Rr>&Qw2~uUCq#*b8S*oT?oMk{1@@skZ5wM4NVdOtCau{ncFk_R z65_Bi`ORyVY-+V)BHKsP*F`*itr6DMZ-=$IZQhvZE68)xY9T3W9^|{QSf;eM)10O8 zjb>9SYvZnx& z&t`hyjgT93ZU=S-x^Z73bvT!FpQ?QYyQ^XFZ7DP?&39q&A4KXlgx2}ln26jbSoMilQvIRA^#`m|O8P2Kb`vL^O*ylg2R7MuFmHGRuv#BHe{#S7IC5`m zzTLS@KFk_RCtaKjN|rO2d26SX-MjhRhi>U&RL)~}7wgWIWS+v<8HyIVQ9#ahytTTgCY zw103rsY$ZX3%%`f@zDt%`QmtmwNPfPbDG_2-rC zpm{y7-`1W6nVff@ULNeublpoA{oXzWb1u&xQqLQ^liCe3m1H@;81=eU_^v9xg?}5{ zIHh9J&gW*%EW0k}-CeKSSX2&c32)b5%cbI>T*|_Kh_mFVlFlB?ZEE{rHZrnxH=xpqkmbx4d&=}0T+1(*6MOO=;pT0ygnN4b5F2V@NI4Bmb~p? zvV-;M@9mDY>6e}_+p{A4on1H5@Vi?Xy8zQYtQCLWnp^AM%-U=3Yi{Q`X?Jt}u$jw> zx$Q5u1g{y(2V88O34sOXiu6`XmP?h?VAk;ao%-lYGq>+|iz!%p?=J6tb<*DQzEc|y zO4W65PGIx;d1tB2y;K=H>9+puwUe%Gol<*i&udG&nR@DVo}cbJr0x8!1-SN}H$bZ! zCsQ9eGi%&0^p`-d*v}4eZFg(S{(QQCb>2wt$=CqDH@u~|>?7?rbGbq3xeaRtd}M9h zPI5Gac1U;SLh6$6ht&sqw7mNwdtUUg7IAR^xTLg+V_!d4Z>|HHEsd8>(mOOV6%TL+ zw3{Mu_q$^@cRCjG0M;UIP*?4%Kn1UP2oJAls_4KgrZw~~SN^zJ>J^I|KnAIxX$ zWU3>uReg)WJ|t^QafouTH_L88_KguY{5kO35@1fkc#}ao>j!I?n*psI`i#a1j!Q1W zP1^N4#Z4P{)hStf_jbCtlh%v;cU$q?TWdcc^Yae(GvMR&a|ilNkv{1bGGHHLwaYX47 z=AjMU*DFDPH`gDeHJu}k57@r*GXCM?#=uAA3Wq^jcZTQILX7=V{^8$M_S0Zb$Se4y za%yH}$^~l=WA9=A+6-V{>IuA*>7FI61JaeUzJ|G;!ase`SNfK5O{U00l3b&-gYAJI z9wZsrN4hQ%*{$#l&~t(EVLb0p7>=$Ffk$3@Hn;cX0*>7d@eIz-zHKC(+v@xKefHp% zicfYri+2Xh2BmD~9(9mrc6@*6C98+gzPA6EsUDomTFVXdULiZNXQ+!_qJEHseFb>2 zy#d{)#dvRndd?sp;?2PzUHOW86ou1rzmXQm{2wOQ^K#zj>pHsI!*3!N+S$tfdQ}d~ zh*No5U+;AEo^!pu-{(L-%WjNv7xsG4zdM3=`22w$hnZxEuR%xKD*IM``X2OShVNti zEsqtwKZeE#WbU>%TY9}r{iQOOfA>u?cMyzgjh` zP9Gm%=e^vrKe=8I-LaFMak{u`UXQ=Dh;7E`@Z0ns#1ZhjHs_Ry|8Pz(*iVZfABvae z^`-ADE+56Zu3cQqPAa^XJ)qBC*VE-U$KjxRblsFOqxByKn^BHSaGLko(YQ|FoNhp$ z&jGH-V(mfBy?lL&8xD_gjXcvHtIYEhIk_36FV>X4>Z3atbJ+AGofCdrfn0h(J8B-l z((7Da*7dakI>+a*jyV3H8;lL#dNqYNqIm+x0e(PQTW23Mn+Nc-x$hF$HwFC$Z1gqk zL+<8IT2Hrgxq@~XS*}9AqHRFC*2YG;m%gNHW|`X?<|E#_+XM>%_T_LU*0OzYFreQ>npiW9gKhFPUwz9qgSC5`NGR zWtj8zg5FP*J=o}q0^QS+`Bxd^#5KQOaNmvGFaDe3@U9t& zHxJv(@&^5RcBcw9c8C||<9m5u5b zsfT14?NiYwbeX^JcN-~ZcEM$@C&3*fyKwxJao-922Q@O+uwBA*U1`3iJ)G@v8K8qF zJAWP66DHYKsuACpKKA`o^*KFwVO-tlCbQ^V`eiojR(_hFqXR!^=B<}lxqH)VdY_vO3;`f-l$4-tE?qAMEdhtUPm zZvvhSF&b( z)R9VFy59j=c-tWBPyI4vY~riq?a@z;Fkox}ZLwab2Kv^;$O4*j)5VROr|kzQ1G{|> z$L_;#w}iep=!e7*h+jMda&m__?-T!TjmTrL#l-yB_)Eai807evz}U<^4NAoW@IAv1 z`lGE27S~|!a(C?{)BOq@N6+m+QuHC#g0Fq6nRFRKlR2~j zn7IyHI;S@np9q){%_QY*LV~C5$sLeU{02>i{^Ua@R8H zz|Yh_N%qC-oo3h1z`g`tByG~j&x3St#QTk~QAuBS2f7b&ITi1x6*33Ejj%nx1y5Cw z2N&q)KszWFXQ&Hu8R;A%^;>33<+8s4k7ySYJaT@xpMlQVtu6w*nteHBj(K0$aZUx^EGk{l*5`x6?#_jig_zOLzw5DEh=O-UW0(cy9^3MfFdz zPD1C!xXT*$k;NcQY{ogP3G7{s!+juUzTO9NA=R5bFME6bO`{8X&7u|Pi#ccJLf;nN zv$??js?r{N5B7{RbM}&4@zGxEAFA)TZ!x^K_`YCxRyI7VnsvQfYXW-2Q@ND#K-bvz zi!R9TaRKDR7-O9MP9qj>)a$B~9l=la>7!&zuxCKC)Q<`>klLkmF8QzxOZzrFdonyb z7*4QyY`5Wu46D%YoXMX8aoT41-)1argp_^^#aVw2{V=_Yh7i zPw)+{cM4=O*y>{eKZ(PZFvdR}g=odF4{EY5x}T@OhWt(a96lO+(Xlv^Y3fFq_Z099 zG6eRzq|}!fo5rqb?gRQ21 z%=9{5lD8XV`d}l$-chn@u=i{S`_ag-L#9nA&n z2e~$0H(wq(urIkCs&~NNpMg0%*@29~wFlXDdEj;dq4`n;1eWisB{`|IqNiCK?_?<)h4i~W*^ z`_BT$_|m#C>ZX+DSiVIdH#V4SGa%zkO=Dz3aVp8DqR2y|?1<#+i<4~9;t8^l(1W#a zc55|8d&lzw=9mxCNWof(Z>p{92pLB5L&&F1?av! zFCZk>BFDNtCYOnP@|>x6p!-hs`{M34+;;FJ$^BD&Ys7}X-bcp7i0)HgyP3)oeanvU z=S%Sx^cAV`2gPRrvJ7(~$HFdcIFA#d8q{ z(4Pl;cI4Q{*GrrG5j--zZzpI^g-7Uf!N1iQm7+Uk0=@LU8^Cbi@irI(>2-E%HvhRC zi<0KuL|wFnFulyTALy_r&0WrGBzp_m$P>WB%mqH7{-l~N6SgQj9q%-_D(Nilp?i6( zirID}a)9M98siR9+{PGhV19}({V5$&qL(AFOZE=vtfh~yukBvp5y{@nPSKAS`u+v* zhv$AIHZI#PUF_RR!yNRvpO7~e`X)LDQNpQ|e~&DW%4C8f}pp&_H|C zpJn%Gi}Wy$nfSKHW1yq2sH;>m!e@xSYqW>c)Ry7?7@)aAf#^4&%Z*WYLfwkRv=8We zB5Nb((1L6q%v^*Gc;fo+<(tCtUdqMm>Hdow*-jz6n>&Hm#^yC~_ZZi#pOR0<^^%x% zjG^B2e|AY})gRf->yKr=cKhqqT{4($KJj@hu&es^RXOZ6u( zexvOr-&(Y61f3XdO3*PI-tgu$zaX<2+bFxZ-RhtWr#|PS=XE3>8ro9HIN4oom5uYZ zX^b(>cALBD?0!(H&rh@Aa$C?5*YIqIv>~5Wani+07SmkxgEL|8%LT85`X8PV8isTC z0^e3CySUF^PlxFMFZVOBXG_o9yS$g}neZ;h9Eog2x%9ksVJ~rEKgIpkEfK#D&~lOF z^8ww=0LK7N%_BC`BsanHEQoXB?<4yAqg1V~{gTCFauw8pW7!e^$g;W?X!d zvxhiMr%e4VO@2w*Kkl=Qwv9g5Lt$6VA3qDx zm(PXG@O!kwufLLb^o>#1TskShWyg|XT3|oG!?EYij_YwQtd+H=XU{;Ewvr>#@3+Rm z3$VXWrL`mD2l*rDiv~F-(JaXYkk2_r(y&P%U_AJ~jCj9E{=J-cE3n6`gS?Grw9#h4 zc!jx&53~I2r!fa1b=SN^L#ut!3aBt)Ot=dgR z-J^9|CUR{tN68{ND)p{4CvvqU`yPO==^3?Km>1}iXv>cSJZt#5lWn3%|Ak35O=%8) zf$Xu*K7B`XYrQBuFyB1>7sOzV@pG|Wl^~XS^D#2_mFFbKjma5Tu)P2lK_i^LBt1{c3n2C+J>xC%X~#428+bc>{ySP`_Q|+)z&-2d z>7@7w%Y~z{1b&7S>4TqJ?lp4-%!vS7YZ}lthsQ{l#LpDOBQME$lYp+rQ{ErancjEI zJ|@0{y;SYE!d)a`f1kEH4FpgzbPQW!})%#AIu4 z10F5B$MZqK?;^=tYKLHO46%5*pDNfF=mV*FaeKPX>#F>gbQO!_v4mse68$ot?>_Lg zGI=M({U205?!xDfawj*z+>I~I#s}1W*j&G0EQ62z*vvh_zV7#Ll3;_v z*!jyD>?zrDiR24rJNw25J%^Ck<;}~lgS5A~16fend)aR1I+nNPdIf`w3;PW7br#Ui ztmV4oxqe7xGVvQ1#}`AiC5ZmP&LX1Cnx z1?wZb!t+>?-mneRFZ!$TY|J=A=%4rwlW{S!fIjG&jlm{ZAE5=1^NoD3TV8ZC*Uw7M zU@^O^KAn(ba+>advGx+?Vhn*7CBM6mXNt)gFOb)mi_q`5G}pUZUEb$WudkDHB%Ryw z#a*f3mrG^8oWB5EvVPL*afHqr$QSs&G0Sf6irEWoj+dwSyN=-S5a4j6N4yb#c9vJ)HVtQmasaMb^Z-%LRM%^PEoBfLG>$Y2js zTZW$rU9q;xeC~NJjp_V+q#ur+i9|clG#7GiImyq}M8vOQT#KB;arv3bh`7IW)~l3l zAMM+4X8O)_t|h!?ogV1PAeWcDq{w@c&mZu*1~P5z(4S|^eq3+us%Ifpo2Y(EWf9J+ z-{~)hB-SVXP5p$drVZvExtQ}O*T-Rb<3i@lczvAQsGKey*jdj}&un98ddCQ4$E9%& zQG2yR&QN$4=-21}j);Y;dq*L+>!Hrt%uzcnf6d~Gte#5A0{e;P^pbN2^s5QlxXZ0>jV)Sf0FaK z-xY1y!JhbRL2lMyEgJOP2#156FOJ{O_&QA&%>GnlBkYabZa)MvxiaWBr^*^d%7mhi z>&kLAIBo5?txNX|7N2%fC!P<;U|zEKq~=SVkV70>nggN7b0y($(EpWUCT^{u!=6lmU&}FT)$FOBc)^ZRg$la*@$erW%!}spA5_J7T8``b0lCJu||`L3^9T z*nE$skC zq6}gD2s-mZsvSjR*%s<}B>x-eYfo~V1dOONi5$$5_a5yjj%O0<5_=pu*Smmq+Bt{C z_8#VPKX;dQ8tZHTE}ECXa}LVD~-o!BOGr>^pz9lO!u8rU<4k)IA5yYJU)IPdroOf>G=d0 zrs^4#i2kr{TZ-97>D{U!RwPnh!zaE`vE%TwA8O4;#AIM?mQ z2wxEB-`f+~E&C_Xq@1^L3NCqV+Ed0Cdj{5?I;s6BvP1T(9ETTh4|>Z9?b!MM6W~O7 ze*&C9$EDrzcDH!eZ$0jxLZ5-Z;iR@eCwR^YY{295=ii+$e{M6J00YevKA}&(&z{mJ z>Y`6>slPj^U#$Of0v|XTjEU41r}T+=c<9R+%*Y;o0?foeaZ)?hfbga^h2D&SJ3Vh*_R%qz3FM~o>33-PZ~QtX7#ME=PZZF7>^VFfm;vl;f-16 zG3?W@uMn6s5qb`lC+0oATf;GuvEP$i*0?@MPBdBDqdJj!45sVFi~%|<=KZ+r{F-?j zkR6lgK0u%FV_*RL+MC6`zh!z@#QR|hWBYM6mjdngy>xpF&tv^9Jm zpR3;o-;K%L9QU*3)&?89o66#ucT!v8K7T!z;M%yi<78zYI9^=P zBs^b0au7)DM4g}PgUVe?IayA5O8v9<1eO}!Cjq=y7`0R0Lw#Q~*CUW@E+@tE@PO{x z!G0T+yLw=G4^sP=;}Ga&%X20~?rX8uZ%wOuj_awpdrtu0p61kNFJ2M~tgr1}yh|7cHn9cx;bi@QlL zQ@M0NW?-%*hn2?C@T_(%Mc`?o@2s$|wR(hhdQB0hiQ&I;y4Qj|u~ptZwCab4R`nSc z;G%kH%zB3ctXJQwbt;qEjXUYh>X*GvJ6S!{FCIFDL-oel*Pf>7>a3gsEpApTwc-2e zq2Frnj`A;?PdhyxSD)HxgN&tdzI<*0yuKi3-`F?zvl^)>*l&-=PI|PcWNHh5KUHJ* zN~q_XNSh7VHB(ws#yt$uDUa5ur{^X?_8#o8e_8M}eSbN%(dU_|FEAD|l-o=3b?Ls8 zLLct|m|+Z*)H0)ak}Rjxa2E}&h1jI|13XUbW@>m((t+Je^i*w?FJk1p<)p0}?6W>2 zH9ZYJN|9^+p52$T(c98F#pXAXxwJ4Q*9!9QMT|)E)4wF|W6;e3ebkZ!rgnD5VDm_B z)(qo063p}rx15VNAEZUyC1X9ocG|*NbjATapf|6wJAtat)x#M3AUq$=k&tQ)wn;ry zn!`!%6|$yna+g4HZpJs$Zwle>TAYu8wqx$i+OS;iy&5kPI_(zaFs%o(i0fzcNNOl! zO;ymdI`w0@gEQ#!m~Ub1&MY!^aQ{N|JR|GivKXVO<^lKbGr9lOuy*_E4P84WhqRd^ z`DLt*pj0QyGORPrmvc&t27?^U%3vzJYm*#G>3utNKM>fVbCx5GcM)MN172S@gSB$X zyzZ4&^OWY#F@7d-7?FFf!;WhekweR3(%OE6_?2=Gj+}`(6&Jz%PqYRo*|TK-K=`}? zu5+limax&sj$9wlTm#{I%{wF)dR^ETFn+VolDo#rheD=i(RXs*DD@MLi4BAG+p!*m z+X3B-n z?&W%Tt`Xk31-(|Tp2L;hHBirMOZ~Ot^U!+|+(Aw)f7ZAmdux*J(S{tkv4Bm5C3s#m z)|fHn9Ljz1Jv}^kDgQkRPBl)U@iFYNG(QXWf(5&$o08d(tIeAB?*{A-#(_&T;E=ByRjo zxkv?W`&|dQNX_Etc#gD8`;F7?ILo`jUhm&pQ?M~lJMUcx=E(L7Zo4VDy;7by=A7d> zemSQ8KHN_=5-+qSJk~0&;WJ*VI;!rvs~c-+s*Y!Y#= zk+lDu7z38zvR*#kvD!~kF3O?@^oaP08~|WIpT8IRKXv?`#~2t`9+hjl>nwa8obdsx zE47sN|AVGu?vyibr6SOGc1`lh(j;!=;~l-wN6Mk~#K$sis5!)yXnUH;BYp;p;YqJ~ zyy+LD@l$I2AV$A2oU1eNbC5fSGMMBD7|zKl=U$9w(qh&xB=3>GQ~WF;UDLXXvmDsx zIk(%`4oL0OnsVmw?lyeZ?4IeI7O8V+ak!73zc?-5J3O9ZJ7{O`G#Jdf%LzW9u${wg zBw7B&=B3MWXF5osAK-G1@m+4)1p9^LTPRrRKFM_)Z{3c&VEzfsP6r!mpJU@HGzq-n zC8-_XSUQ;^*0)^tXC9s@U^N#i9*I$5Er(JO=}*{3_zrlCjp`_2hPvLR~+06Ii`0XU%t$qB(-TU|HSg~yt-Scc=a~=(TZ*Ax0KG@wnJxQ+5XXp zvddU~1>-t}AQ? zc+YdAlzkYGv$VWlD+hh%oMd2Eo9eCe+WB|Ithi?!WYvb>#Rfe2Xs!b>#j|+#tj(KfPM^}R5MfY_k5jW%>8Ql90NH^%;*JP>W;v*XXQ{YW#3+o>0O6pf55YzUcYS#y%W#p%j*WRq(%8j zx=-cCgnxRD@P5W?m{MFwh38&$_h|!k1FS

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/js/jsii-calc@0.7.13.jsii.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/js/jsii-calc@0.7.13.jsii.tgz index eef7587bf20015975a43efa48f8cd0487c889042..cdac38023eb3761e5f8b01a6bd16b19a4cea3b05 100644 GIT binary patch literal 71184 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

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst index 57c7963fc3..6c520364fc 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst +++ b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst @@ -3634,6 +3634,162 @@ Power :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ +PythonReservedWords +^^^^^^^^^^^^^^^^^^^ + +.. py:class:: PythonReservedWords() + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.PythonReservedWords; + + .. code-tab:: javascript + + const { PythonReservedWords } = require('jsii-calc'); + + .. code-tab:: typescript + + import { PythonReservedWords } from 'jsii-calc'; + + + + + .. py:method:: and() + + + + .. py:method:: as() + + + + .. py:method:: assert() + + + + .. py:method:: async() + + + + .. py:method:: await() + + + + .. py:method:: break() + + + + .. py:method:: class() + + + + .. py:method:: continue() + + + + .. py:method:: def() + + + + .. py:method:: del() + + + + .. py:method:: elif() + + + + .. py:method:: else() + + + + .. py:method:: except() + + + + .. py:method:: finally() + + + + .. py:method:: for() + + + + .. py:method:: from() + + + + .. py:method:: global() + + + + .. py:method:: if() + + + + .. py:method:: import() + + + + .. py:method:: in() + + + + .. py:method:: is() + + + + .. py:method:: lambda() + + + + .. py:method:: nonlocal() + + + + .. py:method:: not() + + + + .. py:method:: or() + + + + .. py:method:: pass() + + + + .. py:method:: raise() + + + + .. py:method:: return() + + + + .. py:method:: try() + + + + .. py:method:: while() + + + + .. py:method:: with() + + + + .. py:method:: yield() + + + ReferenceEnumFromScopedPackage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/packages/jsii-python-runtime/.gitignore b/packages/jsii-python-runtime/.gitignore index 14eb494328..6528982188 100644 --- a/packages/jsii-python-runtime/.gitignore +++ b/packages/jsii-python-runtime/.gitignore @@ -3,3 +3,10 @@ src/jsii/_metadata.json *.egg-info dist/ +.env + +*.whl +*.tar.gz + +__pycache__ +.mypy_cache diff --git a/packages/jsii-python-runtime/bin/generate b/packages/jsii-python-runtime/bin/generate index cc901c3bf8..4f9c1cbc9c 100755 --- a/packages/jsii-python-runtime/bin/generate +++ b/packages/jsii-python-runtime/bin/generate @@ -5,14 +5,24 @@ import os.path import shutil EMBEDDED_SOURCE = "node_modules/jsii-runtime/webpack/" +EMBEDDED_INFO = "node_modules/jsii-runtime/package.json" # Copy metadata over into the Python package with open("package.json") as fp: data = json.load(fp) +with open(EMBEDDED_INFO) as fp: + embedded_data = json.load(fp) + with open("src/jsii/_metadata.json", "w") as fp: - json.dump({"version": data["version"]}, fp) + json.dump( + { + "version": data["version"], + "jsii-runtime": {"version": embedded_data["version"]}, + }, + fp, + ) # Embed the JSII runtime into the Python Package. diff --git a/packages/jsii-python-runtime/bin/generate-calc b/packages/jsii-python-runtime/bin/generate-calc new file mode 100755 index 0000000000..15d726cd38 --- /dev/null +++ b/packages/jsii-python-runtime/bin/generate-calc @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +import os +import subprocess +import sys + +subprocess.run( + [ + "jsii-pacmak", + "-t", + "python", + "-o", + ".env/jsii-calc", + "--recurse", + "node_modules/jsii-calc", + ], + check=True, +) +subprocess.run( + [ + sys.executable, + "-m", + "pip", + "install", + "--force-reinstall", + "--upgrade", + "--find-links", + os.path.abspath("."), + ] + + ["jsii"] # TODO: Remove this. + + [d for d in os.listdir(".env/jsii-calc") if d.endswith(".whl")], + cwd=os.path.abspath(".env/jsii-calc"), + check=True, +) diff --git a/packages/jsii-python-runtime/mypy.ini b/packages/jsii-python-runtime/mypy.ini new file mode 100644 index 0000000000..976ba02946 --- /dev/null +++ b/packages/jsii-python-runtime/mypy.ini @@ -0,0 +1,2 @@ +[mypy] +ignore_missing_imports = True diff --git a/packages/jsii-python-runtime/package.json b/packages/jsii-python-runtime/package.json index d99b992e6f..f677c0bb38 100644 --- a/packages/jsii-python-runtime/package.json +++ b/packages/jsii-python-runtime/package.json @@ -5,13 +5,15 @@ "main": "index.js", "scripts": { "generate": "bin/generate", - "build": "npm run generate && python setup.py sdist -d . bdist_wheel -d . && rm -rf build", + "deps": "python -m venv .env && .env/bin/pip install pip==19.0.1 setuptools==40.7.0 wheel==0.32.3 && .env/bin/pip install -r requirements.txt", + "build": "npm run generate && npm run deps && .env/bin/python setup.py sdist -d . bdist_wheel -d . && rm -rf build", "package": "package-python", - "prepack": "echo ok", - "test": "echo ok" + "test": ".env/bin/python bin/generate-calc && .env/bin/py.test -v --mypy" }, "dependencies": { "jsii-build-tools": "^0.7.4", + "jsii-calc": "^0.7.13", + "jsii-pacmak": "^0.7.13", "jsii-runtime": "^0.7.1" }, "repository": { diff --git a/packages/jsii-python-runtime/pytest.ini b/packages/jsii-python-runtime/pytest.ini new file mode 100644 index 0000000000..32fdfd80cf --- /dev/null +++ b/packages/jsii-python-runtime/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +norecursedirs = node_modules diff --git a/packages/jsii-python-runtime/requirements.txt b/packages/jsii-python-runtime/requirements.txt new file mode 100644 index 0000000000..69b20d4167 --- /dev/null +++ b/packages/jsii-python-runtime/requirements.txt @@ -0,0 +1,3 @@ +pytest +pytest-mypy +mypy_extensions diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index cddd95e6fa..112411c1eb 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,5 +1,8 @@ +import json + from typing import Union +from jsii._compat import importlib_resources from ._runtime import ( JSIIAssembly, JSIIMeta, @@ -28,6 +31,12 @@ sinvoke = kernel.sinvoke stats = kernel.stats +# Load our version number and other metadata. +_meta = json.loads(importlib_resources.read_text("jsii", "_metadata.json")) + +__version__ = _meta["version"] +__jsii_runtime_version__ = _meta["jsii-runtime"]["version"] + __all__ = [ "JSIIAssembly", diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 59d20604e6..d11cf3eaf9 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -53,7 +53,7 @@ def _get_overides(klass: JSClass, obj: Any) -> List[Override]: original.fget, "__jsii_name__" ): overrides.append( - Override(property=original.fget.__jsii_name__, cookie=name) + Override(property_=original.fget.__jsii_name__, cookie=name) ) return overrides @@ -115,6 +115,8 @@ def create( CreateRequest(fqn=klass.__jsii_type__, args=args, overrides=overrides) ) + return obj.__jsii_ref__ + def delete(self, ref: ObjRef) -> None: self.provider.delete(DeleteRequest(objref=ref)) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 31e3f4422b..15ee1f2968 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -5,13 +5,14 @@ import subprocess import tempfile -from typing import Type, Union, Mapping, Any, Optional +from typing import TYPE_CHECKING, Type, Union, Mapping, Any, Optional import attr import cattr # type: ignore import jsii._embedded.jsii +from jsii import __jsii_runtime_version__ from jsii._compat import importlib_resources from jsii._utils import memoized_property from jsii._kernel.providers.base import BaseKernel @@ -64,6 +65,10 @@ class _ErrorRespose: _ProcessResponse = Union[_OkayResponse, _ErrorRespose] +# Workaround for mypy#5354 +_ProcessResponse_R: Type[Any] +if not TYPE_CHECKING: + _ProcessResponse_R = _ProcessResponse def _with_api_key(api_name, asdict): @@ -213,13 +218,14 @@ def stop(self): self._ctx_stack.close() def handshake(self): + # Get the version of the runtime that we're using. resp: _HelloResponse = self._serializer.structure( self._next_message(), _HelloResponse ) # TODO: Replace with proper error. assert ( - resp.hello == "jsii-runtime@0.7.10" + resp.hello == f"jsii-runtime@{__jsii_runtime_version__}" ), f"Invalid JSII Runtime Version: {resp.hello!r}" def send( @@ -237,7 +243,7 @@ def send( self._process.stdin.flush() resp: _ProcessResponse = self._serializer.structure( - self._next_message(), _ProcessResponse + self._next_message(), _ProcessResponse_R ) if isinstance(resp, _OkayResponse): diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index 960bc860f6..2d594d0855 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -2,19 +2,20 @@ import inspect import weakref -from .compat import TypedDict +from typing import Any, MutableMapping + from ._kernel.types import JSClass, Referenceable _types = {} -_data_types = {} +_data_types: MutableMapping[str, Any] = {} def register_type(klass: JSClass): _types[klass.__jsii_type__] = klass -def register_data_type(data_type: TypedDict): +def register_data_type(data_type: Any): _data_types[data_type.__jsii_type__] = data_type diff --git a/packages/jsii-python-runtime/tests/__init__.py b/packages/jsii-python-runtime/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py new file mode 100644 index 0000000000..32fc0b9f5f --- /dev/null +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -0,0 +1,916 @@ +import platform + +from datetime import datetime + +import pytest + +from jsii_calc import ( + AbstractClassReturner, + Add, + AllTypes, + AsyncVirtualMethods, + Calculator, + ClassWithPrivateConstructorAndAutomaticProperties, + DoNotOverridePrivates, + DoubleTrouble, + GreetingAugmenter, + IFriendlier, + IFriendlyRandomGenerator, + IRandomNumberGenerator, + InterfaceWithProperties, + JsiiAgent, + JSObjectLiteralForInterface, + JSObjectLiteralToNative, + Multiply, + Negate, + NodeStandardLibrary, + NullShouldBeTreatedAsUndefined, + NumberGenerator, + Polymorphism, + Power, + PythonReservedWords, + ReferenceEnumFromScopedPackage, + ReturnsPrivateImplementationOfInterface, + Statics, + Sum, + SyncVirtualMethods, + UsesInterfaceWithProperties, + composition, +) +from scope.jsii_calc_lib import IFriendly, EnumFromScopedModule, Number + + +# Note: The names of these test functions have been chosen to map as closely to the +# Java Compliance tests as possible. +# Note: While we could write more expressive and better tests using the functionality +# provided to us by pytest, we are making these tests match the Java Compliance +# Tests as closely as possible to make keeping them in sync easier. + +# These map distinct reasons for failures, so we an easily find them. +xfail_datetime = pytest.mark.xfail(reason="Datetime Not Implemented", strict=True) +xfail_objref_array = pytest.mark.xfail( + reason="ObjRef -> Concrete Instance in Array Not Implemented", strict=True +) +xfail_enums = pytest.mark.xfail( + reason="Implement (de)serialization of enums", strict=True +) +xfail_union_property = pytest.mark.xfail( + reason="Implement union properties", strict=True +) +xfail_async = pytest.mark.xfail(reason="Implement async methods", strict=True) +xfail_override_property = pytest.mark.xfail( + reason="Rename property_ to property", strict=True +) +xfail_error_handling = pytest.mark.xfail(reason="Implement Error Handling", strict=True) +xfail_pure_object = pytest.mark.xfail( + reason="Support sending arbitrary objects", strict=True +) +xfail_literal_interface = pytest.mark.xfail( + reason="Implement someone returning a literal interface", strict=True +) +xfail_const_naming = pytest.mark.xfail( + reason="Correct name of const (FOO != foo)", strict=True +) +xfail_abstract_class = pytest.mark.xfail( + reason="Implement (or fix?) abstract class property", strict=True +) +xfail_jsii_agent = pytest.mark.xfail( + reason="Implement JSII_AGENT environment variable.", strict=True +) +xfail_private_class = pytest.mark.xfail( + reason="Implement receiving a private class", strict=True +) + + +class DerivedFromAllTypes(AllTypes): + pass + + +class OverrideAsyncMethods(AsyncVirtualMethods): + def override_me(self, mult): + return self.foo() * 2 + + def foo(self) -> int: + """ + Implement another method, which doesn't override anything in the base class. + This should obviously be possible. + """ + return 2222 + + +class OverrideAsyncMethodsByBaseClass(OverrideAsyncMethods): + pass + + +class OverrideCallsSuper(AsyncVirtualMethods): + def override_me(self, mult): + super_ret = super().override_me(mult) + return super_ret * 10 + 1 + + +class TwoOverrides(AsyncVirtualMethods): + def override_me(self, mult): + return 666 + + def override_me_too(self): + return 10 + + +class SyncOverrides(SyncVirtualMethods): + + multiplier = 1 + return_super = False + call_async = False + another_the_property = None + + def virtual_method(self, n): + if self.return_super: + return super().virtual_method(n) + + if self.call_async: + obj = OverrideAsyncMethods() + return obj.call_me() + + return 5 * n * self.multiplier + + @property + def the_property(self): + return "I am an override!" + + @the_property.setter + def the_property(self, value): + self.another_the_property = value + + +class SubclassNativeFriendlyRandom(Number): + def __init__(self): + super().__init__(908) + self.next_number = 100 + + def hello(self): + return "SubclassNativeFriendlyRandom" + + def next(self): + next_ = self.next_number + self.next_number += 100 + return next_ + + +class PureNativeFriendlyRandom(IFriendlyRandomGenerator): + """ + In this case, the class does not derive from the JsiiObject hierarchy. It means + that when we pass it along to javascript, we won't have an objref. This should + result in creating a new empty javascript object and applying the overrides. + + The newly created objref will need to be stored somewhere (in the engine's object + map) so that subsequent calls won't create a new object every time. + """ + + next_number = 1000 + + def next(self): + n = self.next_number + self.next_number += 1000 + return n + + def hello(self): + return "I am a native!" + + +class AddTen(Add): + def __init__(self, value): + super().__init__(Number(value), Number(10)) + + +class MulTen(Multiply): + def __init__(self, value): + super().__init__(Number(value), Number(10)) + + +@xfail_datetime +def test_primitiveTypes(): + types = AllTypes() + + # boolean + types.boolean_property = True + assert types.boolean_property + + # string + types.string_property = "foo" + assert types.string_property == "foo" + + # number + types.number_property = 1234 + assert types.number_property == 1234 + + # date + types.date_property = datetime.fromtimestamp(123 / 1000.0) + assert types.date_property == datetime.fromtimestamp(123 / 1000.0) + + # json + types.json_property = {"Foo": 123} + assert types.json_property.get("Foo") == 123 + + +@xfail_datetime +def test_dates(): + types = AllTypes() + + # strong type + types.date_property = datetime.fromtimestamp(123 / 1000.0) + assert types.date_property == datetime.fromtimestamp(123 / 1000.0) + + # weak type + types.any_property(datetime.fromtimestamp(999 / 1000.0)) + assert types.any_property == datetime.fromtimestamp(999 / 1000.0) + + +def test_collectionTypes(): + types = AllTypes() + + # array + types.array_property = ["Hello", "World"] + assert types.array_property[1] == "World" + + # map + map_ = {} + map_["Foo"] = Number(123) + types.map_property = map_ + # TODO: No Assertion? + + +@xfail_datetime +def test_dynamicTypes(): + types = AllTypes() + + # boolean + types.any_property = False + assert not types.any_property + + # string + types.any_property = "String" + assert types.any_property == "String" + + # number + types.any_property = 12 + assert types.any_property == 12 + + # date + types.any_property = datetime.fromtimestamp(1234 / 1000.0) + assert types.any_property == datetime.fromtimestamp(1234 / 1000.0) + + # json (notice that when deserialized, it is deserialized as a map). + types.any_property = {"Goo": ["Hello", {"World": 123}]} + assert types.any_property.get("Goo")[1].get("World") == 123 + + # array + types.any_property = ["Hello", "World"] + assert types.any_property[0] == "Hello" + assert types.any_property[1] == "World" + + # array of any + types.any_array_property = ["Hybrid", Number(12), 123, False] + assert types.any_array_property[2] == 123 + + # map + map_ = {} + map_["MapKey"] = "MapValue" + types.any_property = map_ + assert types.any_property.get("MapKey") == "MapValue" + + # map of any + map_["Goo"] = 19_289_812 + types.any_map_property = map_ + types.any_map_property.get("Goo") == 19_289_812 + + # classes + mult = Multiply(Number(10), Number(20)) + types.any_property = mult + assert types.any_property is mult + assert isinstance(types.any_property, Multiply) + assert types.any_property.value == 200 + + +@xfail_objref_array +def test_unionTypes(): + types = AllTypes() + + # single valued property + types.union_property = 1234 + assert types.union_property == 1234 + + types.union_property = "Hello" + assert types.union_property == "Hello" + + types.union_property = Multiply(Number(2), Number(12)) + assert types.union_property.value == 24 + + # map + map_ = {} + map_["Foo"] = Multiply(Number(2), Number(99)) + types.union_map_property = map_ + # TODO: No Assertion? + + # array + types.union_array_property = ["Hello", 123, Number(33)] + assert types.union_array_property[2].value == 33 + + +def test_createObjectAndCtorOverloads(): + Calculator() + Calculator(maximumValue=10) + + +def test_getSetPrimitiveProperties(): + number = Number(20) + + assert number.value == 20 + assert number.double_value == 40 + assert Negate(Add(Number(20), Number(10))).value == -30 + assert Multiply(Add(Number(5), Number(5)), Number(2)).value == 20 + assert Power(Number(3), Number(4)).value == 3 ** 4 + assert Power(Number(999), Number(1)).value == 999 + assert Power(Number(999), Number(0)).value == 1 + + +def test_callMethods(): + calc = Calculator() + + calc.add(10) + assert calc.value == 10 + + calc.mul(2) + assert calc.value == 20 + + calc.pow(5) + assert calc.value == 20 ** 5 + + calc.neg() + assert calc.value == -3_200_000 + + +def test_unmarshallIntoAbstractType(): + calc = Calculator() + calc.add(120) + + assert calc.curr.value == 120 + + +def test_getAndSetNonPrimitiveProperties(): + calc = Calculator() + calc.add(3_200_000) + calc.neg() + calc.curr = Multiply(Number(2), calc.curr) + + assert calc.value == -6_400_000 + + +@xfail_enums +def test_getAndSetEnumValues(): + calc = Calculator() + calc.add(9) + calc.pow(3) + + CompositeOperation = composition.CompositeOperation + + assert calc.string_style == CompositeOperation.CompositionStringStyle.Normal + + calc.string_style = CompositeOperation.CompositionStringStyle.Decorated + + assert calc.string_property == CompositeOperation.CompositionStringStyle.Decorated + assert calc.to_string() == "<<[[{{(((1 * (0 + 9)) * (0 + 9)) * (0 + 9))}}]]>>" + + +@xfail_enums +def test_useEnumFromScopedModule(): + obj = ReferenceEnumFromScopedPackage() + assert obj.foo == EnumFromScopedModule.Value2 + obj.foo = EnumFromScopedModule.Value1 + assert obj.load_foo() == EnumFromScopedModule.Value1 + obj.save_foo(EnumFromScopedModule.Value2) + assert obj.foo == EnumFromScopedModule.Value2 + + +def test_undefinedAndNull(): + calc = Calculator() + assert calc.max_value is None + calc.max_value = None + + +@xfail_objref_array +def test_arrays(): + sum_ = Sum() + sum_.parts = [Number(5), Number(10), Multiply(Number(2), Number(3))] + + assert sum_.value == 5 + 10 + (2 * 3) + assert sum_.parts[0].value == 5 + assert sum_.parts[2].value == 6 + assert sum_.to_string() == "(((0 + 5) + 10) + (2 * 3))" + + +@xfail_objref_array +def test_maps(): + calc2 = Calculator() # Initializer overload (props is optional) + calc2.add(10) + calc2.add(20) + calc2.mul(2) + + assert len(calc2.operations_map.get("add")) == 2 + assert len(calc2.operations_map.get("mul")) == 1 + assert calc2.operations_map.get("add")[1].value == 30 + + +def test_exceptions(): + calc3 = Calculator(initialValue=20, maximumValue=30) + calc3.add(3) + + assert calc3.value == 23 + + with pytest.raises(Exception): + calc3.add(10) + + calc3.max_value = 40 + calc3.add(10) + + assert calc3.value == 33 + + +@xfail_union_property +def test_unionProperties(): + calc3 = Calculator() + calc3.union_property = Multiply(Number(9), Number(3)) + + assert isinstance(calc3.union_property, Multiply) + assert calc3.read_union_value() == 9 * 3 + + calc3.union_property == Power(Number(10), Number(3)) + + assert isinstance(calc3.union_property, Power) + + +def test_subclassing(): + calc = Calculator() + calc.curr = AddTen(33) + calc.neg() + + assert calc.value == -43 + + +def test_testJSObjectLiteralToNative(): + obj = JSObjectLiteralToNative() + obj2 = obj.return_literal() + + assert obj2.prop_a == "Hello" + assert obj2.prop_b == 102 + + +def test_testFluentApiWithDerivedClasses(): + # make sure that fluent API can be assigned to objects from derived classes + obj = DerivedFromAllTypes() + obj.string_property = "Hello" + obj.number_property = 12 + + assert obj.string_property == "Hello" + assert obj.number_property == 12 + + +def test_creationOfNativeObjectsFromJavaScriptObjects(): + """ + See that we can create a native object, pass it JS and then unmarshal + back without type information. + """ + types = AllTypes() + + js_obj = Number(44) + types.any_property = js_obj + unmarshalled_js_obj = types.any_property + assert unmarshalled_js_obj.__class__ == Number + + native_obj = AddTen(10) + types.any_property = native_obj + + result1 = types.any_property + assert result1 is native_obj + + native_obj2 = MulTen(20) + types.any_property = native_obj2 + unmarshalled_native_obj = types.any_property + assert unmarshalled_native_obj.__class__ == MulTen + + +@xfail_async +def test_asyncOverrides_callAsyncMethod(): + obj = AsyncVirtualMethods() + assert obj.call_me() == 128 + assert obj.override_me(44) == 528 + + +@xfail_async +def test_asyncOverrides_overrideAsyncMethod(): + obj = OverrideAsyncMethods() + obj.call_me() == 4452 + + +@xfail_async +def test_asyncOverrides_overrideAsyncMethodByParentClass(): + obj = OverrideAsyncMethodsByBaseClass() + obj.call_me() == 4452 + + +@xfail_async +def test_asyncOverrides_overrideCallsSuper(): + obj = OverrideCallsSuper() + assert obj.override_me(12) == 1441 + assert obj.call_me() == 1209 + + +@xfail_async +def test_asyncOverrides_twoOverrides(): + obj = TwoOverrides() + assert obj.call_me() == 684 + + +@xfail_async +def test_asyncOverrides_overrideThrows(): + class ThrowingAsyncVirtualMethods(AsyncVirtualMethods): + def override_me(self, mult): + raise RuntimeError("Thrown by native code") + + obj = ThrowingAsyncVirtualMethods() + + with pytest.raises(Exception, match="Thrown by native code"): + obj.call_me() + + +@xfail_override_property +def test_syncOverrides(): + obj = SyncOverrides() + assert obj.caller_is_method() == 10 * 5 + + # affect the result + obj.multiplier = 5 + assert obj.caller_is_method() == 10 * 5 * 5 + + # verify callbacks are invoked from a property + assert obj.caller_is_property == 10 * 5 * 5 + + # and from an async method + obj.multiplier = 3 + assert obj.caller_is_async == 10 * 5 * 3 + + +@xfail_override_property +def test_propertyOverrides_get_set(): + so = SyncOverrides() + assert so.retrieve_value_of_the_property == "I am an override!" + so.modify_value_of_the_property("New Value") + assert so.another_the_property == "New Value" + + +@xfail_override_property +def test_propertyOverrides_get_calls_super(): + class SuperSyncVirtualMethods(SyncVirtualMethods): + @property + def the_property(self): + return f"super:{super().the_property}" + + @the_property.setter + def the_property(self, value): + super().the_property = value + + so = SuperSyncVirtualMethods() + + assert so.retrieve_value_of_the_property() == "super:initial value" + assert so.the_property == "super:initial value" + + +@xfail_override_property +def test_propertyOverrides_set_calls_super(): + class SuperSyncVirtualMethods(SyncVirtualMethods): + @property + def the_property(self): + return super().the_property + + @the_property.setter + def the_property(self, value): + super().the_property = f"{value}:by override" + + so = SuperSyncVirtualMethods() + so.modify_value_of_the_property("New Value") + + assert so.the_property == "New Value:by override" + + +@xfail_override_property +def test_propertyOverrides_get_throws(): + class ThrowingSyncVirtualMethods(SyncVirtualMethods): + @property + def the_property(self): + raise RuntimeError("Oh no, this is bad") + + @the_property.setter + def the_property(self, value): + super().the_property = value + + so = ThrowingSyncVirtualMethods() + + with pytest.raises(Exception, match="Oh no, this is bad"): + so.retrieve_value_of_the_property() + + +@xfail_override_property +def test_propertyOverrides_set_throws(): + class ThrowingSyncVirtualMethods(SyncVirtualMethods): + @property + def the_property(self): + return super().the_property + + @the_property.setter + def the_property(self, value): + raise RuntimeError("Exception from overloaded setter") + + so = ThrowingSyncVirtualMethods() + + with pytest.raises(Exception, match="Exception from overloaded setter"): + so.modify_value_of_the_property("Hii") + + +@pytest.mark.xfail( + reason="Test no longer makes sense with lifted properties.", strict=True +) +def test_propertyOverrides_interfaces(): + class TInterfaceWithProperties(InterfaceWithProperties): + + x = None + + @property + def read_only_string(self): + return "READ_ONLY_STRING" + + @property + def read_write_string(self): + return self.x + "?" + + @read_write_string.setter + def read_write_string(self, value): + self.x = value + "!" + + obj = TInterfaceWithProperties() + interact = UsesInterfaceWithProperties(obj) + + assert interact.just_read() == "READ_ONLY_STRING" + assert interact.write_and_read("Hello") == "Hello!?" + + +def test_interfaceBuilder(): + interact = UsesInterfaceWithProperties( + readOnlyString="READ_ONLY", readWriteString="READ_WRITE" + ) + assert interact.just_read() == "READ_ONLY" + assert interact.write_and_read("Hello") == "Hello" + + +@xfail_override_property +def test_syncOverrides_callsSuper(): + obj = SyncOverrides() + assert obj.caller_is_property == 10 * 5 + obj.return_super = True + assert obj.caller_is_property == 10 * 2 + + +@xfail_override_property +def test_fail_syncOverrides_callsDoubleAsync_method(): + obj = SyncOverrides() + obj.call_async = True + + # TODO: Error Handling + with pytest.raises(Exception): + obj.caller_is_method() + + +@xfail_override_property +def test_fail_syncOverrides_callsDoubleAsync_propertyGetter(): + obj = SyncOverrides() + obj.call_async = True + + # TODO: Error Handling + with pytest.raises(Exception): + obj.caller_is_property + + +@xfail_override_property +def test_fail_syncOverrides_callsDoubleAsync_propertySetter(): + obj = SyncOverrides() + obj.call_async = True + + # TODO: Error Handling + with pytest.raises(Exception): + obj.caller_is_property = 12 + + +@pytest.mark.xfail(reason="Unknown", strict=True) +def test_testInterfaces(): + friendly: IFriendly + friendlier: IFriendlier + random_number_generator: IRandomNumberGenerator + friendly_random_generator: IFriendlyRandomGenerator + + add = Add(Number(10), Number(20)) + friendly = add + assert friendly.hello() == "Hello, I am a binary operation. What's your name?" + + multiply = Multiply(Number(10), Number(30)) + friendly = multiply + friendlier = multiply + random_number_generator = multiply + assert friendly.hello() == "Hello, I am a binary operation. What's your name?" + assert friendlier.goodbye() == "Goodbye from Multiply!" + assert random_number_generator.next() == 89 + + friendly_random_generator = DoubleTrouble() + assert friendly_random_generator.hello() == "world" + assert friendly_random_generator.next() == 12 + + poly = Polymorphism() + assert ( + poly.say_hello(friendly) + == "oh, Hello, I am a binary operation. What's your name?" + ) + assert poly.say_hello(friendly_random_generator) == "oh, world" + assert ( + poly.say_hello(SubclassNativeFriendlyRandom()) + == "oh, SubclassNativeFriendlyRandom" + ) + assert poly.say_hello(PureNativeFriendlyRandom()) == "oh, I am a native!" + + +@xfail_pure_object +def test_testNativeObjectsWithInterfaces(): + # create a pure and native object, not part of the jsii hierarchy, only implements + # a jsii interface + pure_native = PureNativeFriendlyRandom() + subclassed_native = SubclassNativeFriendlyRandom() + generator_bound_to_p_subclassed_object = NumberGenerator(subclassed_native) + generator_bound_to_pure_native = NumberGenerator(pure_native) + + assert generator_bound_to_p_subclassed_object.get_generator() is subclassed_native + generator_bound_to_p_subclassed_object.is_same_generator(subclassed_native) + assert generator_bound_to_p_subclassed_object.next_times_100() == 10000 + + # When we invoke nextTimes100 again, it will use the objref and call into the same + # object. + assert generator_bound_to_p_subclassed_object.next_times_100() == 20000 + + assert generator_bound_to_pure_native.get_generator() is pure_native + generator_bound_to_pure_native.is_same_generator(pure_native) + assert generator_bound_to_pure_native.next_times_100() == 100_000 + assert generator_bound_to_pure_native.next_times_100() == 200_000 + + +@xfail_literal_interface +def test_testLiteralInterface(): + obj = JSObjectLiteralForInterface() + friendly = obj.give_me_friendly() + gen = obj.give_me_friendly_generator() + + assert friendly.hello() == "I am literally friendly!" + assert gen.hello() == "giveMeFriendlyGenerator" + assert gen.next() == 42 + + +@xfail_literal_interface +def test_testInterfaceParameter(): + obj = JSObjectLiteralForInterface() + friendly = obj.give_me_friendly() + greeting_augmenter = GreetingAugmenter() + + assert friendly.hello() == "I am literally friendly!" + assert ( + greeting_augmenter.better_greeting(friendly) + == "I am literally friendly! Let me buy you a drink!" + ) + + +def test_statics(): + assert Statics.static_method("Yoyo") == "hello ,Yoyo!" + assert Statics.instance.value == "default" + + new_statics = Statics("new value") + Statics.instance = new_statics + + assert Statics.instance is new_statics + assert Statics.instance.value == "new value" + + assert Statics.non_const_static == 100 + + +@xfail_const_naming +def test_consts(): + obj = Statics.CONST_OBJ + + assert Statics.FOO == "hello" + assert obj.hello() == "world" + assert Statics.BAR == 1234 + assert Statics.ZOO_BAR.get("hello") == "world" + + +def test_reservedKeywordsAreSlugifiedInMethodNames(): + obj = PythonReservedWords() + obj.import_() + obj.return_() + + +@xfail_async +def test_nodeStandardLibrary(): + obj = NodeStandardLibrary() + + assert obj.fs_read_file() == "Hello, resource!" + assert obj.fs_read_file_sync() == "Hello, resource! SYNC!" + assert len(obj.get_os_platform()) > 0 + assert ( + obj.crypto_sha_256() + == "6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50" + ) + + +@xfail_abstract_class +def test_returnAbstract(): + obj = AbstractClassReturner() + obj2 = obj.give_me_abstract() + + assert obj2.abstract_method("John") == "Hello, John!!" + assert obj2.prop_from_interface == "propFromInterfaceValue" + assert obj2.non_abstract_method() == 42 + + iface = obj.give_me_interface() + assert iface.prop_from_interface == "propFromInterfaceValue" + + assert ( + obj.return_abstract_from_property.abstract_property == "hello-abstract-property" + ) + + +def test_doNotOverridePrivates_method(): + class TDoNotOverridePrivates(DoNotOverridePrivates): + def private_method(self): + return "privateMethod-Override" + + obj = TDoNotOverridePrivates() + + assert obj.private_method_value() == "privateMethod" + + +def test_doNotOverridePrivates_property_by_name(): + class TDoNotOverridePrivates(DoNotOverridePrivates): + def private_property(self): + return "privateProperty-Override" + + obj = TDoNotOverridePrivates() + + assert obj.private_property_value() == "privateProperty" + + +def test_doNotOverridePrivates_property_getter(): + class TDoNotOverridePrivates(DoNotOverridePrivates): + @property + def private_property(self): + return "privateProperty-Override" + + @private_property.setter + def private_property(self): + raise RuntimeError("Boom") + + obj = TDoNotOverridePrivates() + + assert obj.private_property_value() == "privateProperty" + + # verify the setter override is not invoked. + obj.change_private_property_value("MyNewValue") + assert obj.private_property_value() == "MyNewValue" + + +def test_classWithPrivateConstructorAndAutomaticProperties(): + obj = ClassWithPrivateConstructorAndAutomaticProperties.create("Hello", "Bye") + assert obj.read_write_string == "Bye" + assert obj.read_only_string == "Hello" + + +def test_nullShouldBeTreatedAsUndefined(): + obj = NullShouldBeTreatedAsUndefined("hello", None) + obj.give_me_undefined(None) + obj.give_me_undefined_inside_an_object( + thisShouldBeUndefined=None, + arrayWithThreeElementsAndUndefinedAsSecondArgument=["hello", None, "boom"], + ) + obj.change_me_to_undefined = None + obj.verify_property_is_undefined() + + +@xfail_jsii_agent +def test_testJsiiAgent(): + assert JsiiAgent.jsii_agent == f"Python/{platform.python_version()}" + + +@xfail_private_class +def test_receiveInstanceOfPrivateClass(): + assert ReturnsPrivateImplementationOfInterface().private_implementation.success diff --git a/packages/jsii-reflect/test/classes.expected.txt b/packages/jsii-reflect/test/classes.expected.txt index 0b390d0325..3cd528a0fd 100644 --- a/packages/jsii-reflect/test/classes.expected.txt +++ b/packages/jsii-reflect/test/classes.expected.txt @@ -39,6 +39,7 @@ OptionalConstructorArgument OverrideReturnsObject Polymorphism Power +PythonReservedWords ReferenceEnumFromScopedPackage ReturnsPrivateImplementationOfInterface RuntimeTypeChecking diff --git a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt index 5a03f107e4..ecee245823 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt @@ -668,6 +668,74 @@ assemblies │ │ └─┬ pow property │ │ ├── immutable │ │ └── type: class:@scope/jsii-calc-lib.Value + │ ├─┬ class PythonReservedWords + │ │ └─┬ members + │ │ ├─┬ () method + │ │ │ └── returns: void + │ │ ├─┬ and() method + │ │ │ └── returns: void + │ │ ├─┬ as() method + │ │ │ └── returns: void + │ │ ├─┬ assert() method + │ │ │ └── returns: void + │ │ ├─┬ async() method + │ │ │ └── returns: void + │ │ ├─┬ await() method + │ │ │ └── returns: void + │ │ ├─┬ break() method + │ │ │ └── returns: void + │ │ ├─┬ class() method + │ │ │ └── returns: void + │ │ ├─┬ continue() method + │ │ │ └── returns: void + │ │ ├─┬ def() method + │ │ │ └── returns: void + │ │ ├─┬ del() method + │ │ │ └── returns: void + │ │ ├─┬ elif() method + │ │ │ └── returns: void + │ │ ├─┬ else() method + │ │ │ └── returns: void + │ │ ├─┬ except() method + │ │ │ └── returns: void + │ │ ├─┬ finally() method + │ │ │ └── returns: void + │ │ ├─┬ for() method + │ │ │ └── returns: void + │ │ ├─┬ from() method + │ │ │ └── returns: void + │ │ ├─┬ global() method + │ │ │ └── returns: void + │ │ ├─┬ if() method + │ │ │ └── returns: void + │ │ ├─┬ import() method + │ │ │ └── returns: void + │ │ ├─┬ in() method + │ │ │ └── returns: void + │ │ ├─┬ is() method + │ │ │ └── returns: void + │ │ ├─┬ lambda() method + │ │ │ └── returns: void + │ │ ├─┬ nonlocal() method + │ │ │ └── returns: void + │ │ ├─┬ not() method + │ │ │ └── returns: void + │ │ ├─┬ or() method + │ │ │ └── returns: void + │ │ ├─┬ pass() method + │ │ │ └── returns: void + │ │ ├─┬ raise() method + │ │ │ └── returns: void + │ │ ├─┬ return() method + │ │ │ └── returns: void + │ │ ├─┬ try() method + │ │ │ └── returns: void + │ │ ├─┬ while() method + │ │ │ └── returns: void + │ │ ├─┬ with() method + │ │ │ └── returns: void + │ │ └─┬ yield() method + │ │ └── returns: void │ ├─┬ class ReferenceEnumFromScopedPackage │ │ └─┬ members │ │ ├─┬ () method diff --git a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt index e3ba77633d..0b625b241a 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt @@ -52,6 +52,7 @@ assemblies │ ├── class Polymorphism │ ├─┬ class Power │ │ └── base: CompositeOperation + │ ├── class PythonReservedWords │ ├── class ReferenceEnumFromScopedPackage │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking diff --git a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt index 24e6f4162c..b9472d21c3 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt @@ -276,6 +276,41 @@ assemblies │ │ ├── base property │ │ ├── expression property │ │ └── pow property + │ ├─┬ class PythonReservedWords + │ │ └─┬ members + │ │ ├── () method + │ │ ├── and() method + │ │ ├── as() method + │ │ ├── assert() method + │ │ ├── async() method + │ │ ├── await() method + │ │ ├── break() method + │ │ ├── class() method + │ │ ├── continue() method + │ │ ├── def() method + │ │ ├── del() method + │ │ ├── elif() method + │ │ ├── else() method + │ │ ├── except() method + │ │ ├── finally() method + │ │ ├── for() method + │ │ ├── from() method + │ │ ├── global() method + │ │ ├── if() method + │ │ ├── import() method + │ │ ├── in() method + │ │ ├── is() method + │ │ ├── lambda() method + │ │ ├── nonlocal() method + │ │ ├── not() method + │ │ ├── or() method + │ │ ├── pass() method + │ │ ├── raise() method + │ │ ├── return() method + │ │ ├── try() method + │ │ ├── while() method + │ │ ├── with() method + │ │ └── yield() method │ ├─┬ class ReferenceEnumFromScopedPackage │ │ └─┬ members │ │ ├── () method diff --git a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt index 9016018130..0c890a2e3a 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt @@ -38,6 +38,7 @@ assemblies │ ├── class OverrideReturnsObject │ ├── class Polymorphism │ ├── class Power + │ ├── class PythonReservedWords │ ├── class ReferenceEnumFromScopedPackage │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking From 2473c33045ed5e7e48a809645f19e71ebd1703fe Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 15:21:43 -0500 Subject: [PATCH 091/117] Update after fixing tests --- packages/jsii-calc/test/assembly.jsii | 31 +- .../.jsii | 109 ++++- .../jsii-calc-0.7.14.tgz | Bin 71184 -> 72814 bytes .../amazon/jsii/tests/calculator/$Module.java | 2 +- .../calculator/jsii-calc@0.7.14.jsii.tgz | Bin 71184 -> 72814 bytes .../js/jsii-calc@0.7.14.jsii.tgz | Bin 71184 -> 72814 bytes .../expected.jsii-calc/sphinx/jsii-calc.rst | 459 ++++++++++++------ .../jsii-reflect/test/classes.expected.txt | 4 +- .../test/jsii-tree.test.all.expected.txt | 11 +- .../jsii-tree.test.inheritance.expected.txt | 2 +- .../test/jsii-tree.test.members.expected.txt | 8 +- .../test/jsii-tree.test.types.expected.txt | 2 +- 12 files changed, 446 insertions(+), 182 deletions(-) diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index b68763761c..308ac5320a 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -2918,7 +2918,20 @@ } ] }, - + "jsii-calc.PublicClass": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.PublicClass", + "initializer": { + "initializer": true + }, + "kind": "class", + "methods": [ + { + "name": "hello" + } + ], + "name": "PublicClass" + }, "jsii-calc.PythonReservedWords": { "assembly": "jsii-calc", "fqn": "jsii-calc.PythonReservedWords", @@ -3026,20 +3039,6 @@ ], "name": "PythonReservedWords" }, - "jsii-calc.PublicClass": { - "assembly": "jsii-calc", - "fqn": "jsii-calc.PublicClass", - "initializer": { - "initializer": true - }, - "kind": "class", - "methods": [ - { - "name": "hello" - } - ], - "name": "PublicClass" - }, "jsii-calc.ReferenceEnumFromScopedPackage": { "assembly": "jsii-calc", "docs": { @@ -3950,5 +3949,5 @@ } }, "version": "0.7.14", - "fingerprint": "GcECpwq2OHeqaiSnovp794YudgAyL3gzYJqJz36/13c=" + "fingerprint": "vzzjYk0Hbo0lF9tGOMPQLWPG2MEEfhY22eDkXY+LDEE=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii index e98c525e53..308ac5320a 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii @@ -2932,6 +2932,113 @@ ], "name": "PublicClass" }, + "jsii-calc.PythonReservedWords": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.PythonReservedWords", + "initializer": { + "initializer": true + }, + "kind": "class", + "methods": [ + { + "name": "and" + }, + { + "name": "as" + }, + { + "name": "assert" + }, + { + "name": "async" + }, + { + "name": "await" + }, + { + "name": "break" + }, + { + "name": "class" + }, + { + "name": "continue" + }, + { + "name": "def" + }, + { + "name": "del" + }, + { + "name": "elif" + }, + { + "name": "else" + }, + { + "name": "except" + }, + { + "name": "finally" + }, + { + "name": "for" + }, + { + "name": "from" + }, + { + "name": "global" + }, + { + "name": "if" + }, + { + "name": "import" + }, + { + "name": "in" + }, + { + "name": "is" + }, + { + "name": "lambda" + }, + { + "name": "nonlocal" + }, + { + "name": "not" + }, + { + "name": "or" + }, + { + "name": "pass" + }, + { + "name": "raise" + }, + { + "name": "return" + }, + { + "name": "try" + }, + { + "name": "while" + }, + { + "name": "with" + }, + { + "name": "yield" + } + ], + "name": "PythonReservedWords" + }, "jsii-calc.ReferenceEnumFromScopedPackage": { "assembly": "jsii-calc", "docs": { @@ -3842,5 +3949,5 @@ } }, "version": "0.7.14", - "fingerprint": "GcECpwq2OHeqaiSnovp794YudgAyL3gzYJqJz36/13c=" + "fingerprint": "vzzjYk0Hbo0lF9tGOMPQLWPG2MEEfhY22eDkXY+LDEE=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.14.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.14.tgz index cdac38023eb3761e5f8b01a6bd16b19a4cea3b05..98fd2d0f53be3df1accb1b0300b13c6ef49b2b8c 100644 GIT binary patch literal 72814 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 literal 71184 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

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.OverrideReturnsObject": return software.amazon.jsii.tests.calculator.OverrideReturnsObject.class; case "jsii-calc.Polymorphism": return software.amazon.jsii.tests.calculator.Polymorphism.class; case "jsii-calc.Power": return software.amazon.jsii.tests.calculator.Power.class; - case "jsii-calc.PythonReservedWords": return software.amazon.jsii.tests.calculator.PythonReservedWords.class; case "jsii-calc.PublicClass": return software.amazon.jsii.tests.calculator.PublicClass.class; + case "jsii-calc.PythonReservedWords": return software.amazon.jsii.tests.calculator.PythonReservedWords.class; case "jsii-calc.ReferenceEnumFromScopedPackage": return software.amazon.jsii.tests.calculator.ReferenceEnumFromScopedPackage.class; case "jsii-calc.ReturnsPrivateImplementationOfInterface": return software.amazon.jsii.tests.calculator.ReturnsPrivateImplementationOfInterface.class; case "jsii-calc.RuntimeTypeChecking": return software.amazon.jsii.tests.calculator.RuntimeTypeChecking.class; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.14.jsii.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.14.jsii.tgz index cdac38023eb3761e5f8b01a6bd16b19a4cea3b05..98fd2d0f53be3df1accb1b0300b13c6ef49b2b8c 100644 GIT binary patch literal 72814 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 literal 71184 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

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 literal 71184 zcmV)EK)}BriwFP!000001MI!|W81jVFx;Q>SFqmqd)D4MiVh!fw%fjvPkDXBmha8J z8;YbP#uTZNlx?L?{`YTY0FdA*Qj(o)8@E|oA_xrTo&hizsoK5TH{Oic@5(37vH!B* zpK7(bv9_k9eGfm4^;$#uORce1Z!|U<>y5@=s7BCl$urH@nrdlFtN8VU;d-WHVsiNx`QwKt}`CB_52Q{Uf>ng_068D`Rpxe ztf0{s{?`}r-jeS4w&6$Tf+X}{LNuEu8%TbRF5d||0ID)YX_{J(kwZ?)Fzn1$S~ZUX9Xu1N;e)dMk1kogEXNR z-&ShXN@G)=NY?y__^*A(vAmQf)GzT1J#18Jm5mS{b?gruHv~f{F2=ITwb4~NhWlV@ zh7hx*v1?(Af$xvJcW>UPkDd@o%^8YDj@wsl^Rvoz8mgLLOwF-<*X)jg`$JXfxKG412$v+ zCTO>T@w#5AGLzyOBgZp=oRg4|knON70F%Ku5}3e4mfH15ek%9|^2)0(U)z+=^usm( z8&Z?cG)A8PSKq8wYa87ETidAD>uccuRqJaT-~GRr`1$vYYBfb;@+Wa|6}{8P-wSEw zxU~);D`p|*RN2K8PGJo{i^^UY2tvcpr?M9YPDI1URCYNRE0{#;YuT^9c6#wHs4;p~ z5k}_UCnE_lZqf^v&|1zHue1Q7(;oge%|90)miE%6eiNQM`}qG7=EnO>er zLuX84k(xRaPw8ATlh&p&rW&6d4Ib|xrc=JUzp;2v<16_X-W^K+Q=A^n4?Fqc2c<*n9YK#h6EN~jy|@G5BBoM0Pi1HqWzkH zH5iX(!u}U#VxA}0%2$;J#!wX;@unvDB(B7g3T&RmvYD64gkK(0ODQTTdreT1{!(h_ zOC0*b>L&(!WI>gyn@}EOYD28+##48dW*5aw^S3S4i}a}S2XVV3R`inMPmdEp#ZvEI zcBE}|$d+VNL)7HI6OLxurf;g2`Pp!zgGL|lHKgbmpb88ZNE=J0MYMPVj<$HIjanBq zhoQG7QRoutJxs>kn>OR4=ro3gKXCLMI5LRANY8b#Xmd=R#f`cPt$f3cju9Ux(jWa! z27pXqq_~A6*Bk=U9~eXXF6g|3PnYRD{T>0=H9*PRDSr2qF~S}tHa`Dhq)_?&c{s?G(X`+%=wLjYJ%1x>MyGpR!cNQTBJ4oO*kQC3?fskbn#$tEdA zL;YEX`-}TH8S~B(23;?~`UQNimT5z%bqW(>tHlYHhJYxRa{$jDDT)1DKoIg_>2DAM zb*Uf45gk>E_;9*jKQ>|?HZm)B#40h0RgULyGQ~*zQejH>#3z;DMcdU<1WCz&Q{p6lowIYQ&D_T z0F#AuJaw`V949!jwCh_acF3{{mUR({=ck*7DQeyH6p{=~mRVy!hr%g0QF@N6sFtNr z20`)0qmkocCapW6lvhPT@_2@iYLw-o0L`WjO8SHC4^%%C1Z;&#J}w-_)5y@UC+wMJ z`3A1@s5l}4R>-CZRD2WuoB>o_RQR1_R(hNreo0}?Mc&h)kzsYQgbW|gn}ja6Rcq{pSoZQ2F9PhrY1OEMM#U7)&jFW zR!4t|ISLVpwJo_!>VbX(3$4HVG;ZN!Yt(=Y%A`ZShE$w0=W}E+Qq{e~Lpef(} zp7?J1rmKZ3c_PKj`Vh}f{d9}Te#%n+x!J0O2IS)`n3EQyJ&CAgm?(=2ayTHBVG2<` zg*ekY%c6GC&Jv2_cx?IR$VxcPrMoP}G;vn=eIeAox1Glqw;SI;#KmX+Ulw)oS-*Vb z<VKZ4Q@Ni+mduEJJ2Zyfc!Dbxfya{& zb%n8h>x|tQUc=00+uO%Aqr7c7@my3GDy8Dqc{FsE=A%7nb7DB&+c%NP>>GYdb?47w z{xPaO?;fJnqHxq_h9lkT=HyVPvggz#4?zFT)6?<_rps-|#{@jGiL&e&hGH9i6=CyM zR+aA9S9oJ}RjE`e^onz@P6{kL!Hav2Ge41Wd+d9B?>~0Cn71f#c=|S^Ve-7fP!x>M zGlP+m$xDG_u|nyQxGX;vlS(g;%5G`F^cEzT|0V2}PUbu-AGf(#w%(iA+Lh`0W7Rqi zOy}&zKBc>F!rB9L0MHy;U{~W!oT2F%OL;ErtWtP5_Iy0;VtLAkVEO*oxNw{gOVcHb z&9wgKm@2KyGa~XC`?LXzP2$6nq9Q|y7Qh3h3n85~SydhfrZ!-!@$icM!8Yv&=iX3M z<$`c3&xE!Zj_@8o*h5gd2!_gN&{eg2c-J*ZANC#G z3gbI?8by6jO$!%j6%*#8o2qXxz3AB1=2&+=!mU{UXlGlaU@JPx8L`lW{dat{in0;KP_?CEOqGi zo@*MmE@$c&ce-r)CRcT$3=D9a|2o|=Q@e$1vP_wCe9-6I$eO7-7P6^zy1>q`!8I<) z`Pt}#J6q@XV++Xc43muu^@1lW_#(r)hG&aQM1%znXcSw@FK9}eN_cvh#{{BO99l4K z?7GmB@6JW?P(}kD>2zW}u)T#$t%Q*UTG_By#p!;6@TT&04Q*SD!<>>(7gUOwB7C8& zF-pVn`;>l^yw#)Pw(8l;NK@C5q|7Z=cp-)e6Bda4RQ+pguKwB!0(_w!_$-Mu+=?%- zS^$9%(ES%8@C4JdY1k`(G27^;DxH#6P=%;3lYArRu@Lp3-G3qV*uhUgo-yD^pAW;x0N(pS#bKIe!FODY1>gWY%lKXn0E~rsy(k9Robd^J5dZ{pv%(>O8(818M zwjA4ki!n0JWvD)x!|_nWV=NXkZB~y=DnnPm$5WpQ?@fz^42f*@oNE$OXTJNSQUyDd z>ClqX5|gTF#t8Gk+|HxX$NgCaFi?8;Z$26pwKq7mC_+-il5$zBw}tKJ4ZD1gj_HE- z@V=7U=H*mabX($hv+ApytdRwc-0aBvz~iDr&f7@=E0pbsM&g0;GZV#BQry4TyYp7} z5d-jK$hV>bih#^@-;0AhjU_P$a&7v9W9B)WQV!|}d{0bgS>C>#mAj)%FraR|hK^<)=md(z|tjx~n z3oIp;$w9MKU(6DsV!4uqZGz5Y!*6?HQ%u5+(Nn>3HguU=-2Rwr?wM_SZojjb^cj}4 z!h#X~_(_b+Wv5)N;(Vt`B2cryUkcoyK|H6i9+p%V}nm}K^>+?ZkiRdos{-@$Vk)!bgxKki3zvSqAO^&d z8DX`HY+7O*cPi}spK7T$xr`TcPzseSm_sr||4n-VD>?I3fhYwot)D(WsTW?GZx-@S zb6%ViCpZwrb2D?DrA+VeIem%ZnaF`^_XSKj^+#vAl*M>V_Czh7D+f4LBtnOnCd^JH z&Ag#%o&?osD$1Ypyg)if=E=jkp*ejUSP>Lk(>o2tY$59n*#3w5+qHL!?$Gf}R}80o zK*dMrN7)f8Hn5_K96%@pRC4Noiyq9uhi+1U#(oqA&p#JTXHz3FwT7PQQl zgP4V_?WN6q{=B5%t_=3sr`zaQ_IEDUiFWi=U83oE)nKnPPxkZ8&PpU1PN#HTp^f5A zr3`!lrNq_|^b3bxo8K|hV~Z?7gA#YvL^J=zz4>DLZ-(`Yg_;jMmc=E5uinI{>lLLP z?#1D+o@D0H|D%bxkad7kl*6nE*~|}1f_f3A;ne%N81?AIlVpXUnW)xFNH9H~ZFwM5 z5~4Vbf0`w-n9T>tQ0t2`depPnWn6q|DixayOx)>)djdshGwmMKEX(K`h7ay-bKIxf zRp+`GH`&=Yku>PiU2+1r1;~a7EEXglsgX*QjPXwk3c8DkMuMgpoFrypmg1q@g!Ar$ zfo4r~%Wf1j@Z_2u?s#X1*@7s!$c6Kcy_Ul;HO zMAMgAaG85vSB=$xxA<{*ii>vok^opy%B%R;*wEW&~%uUUZ)Apy{}sN2#QC`0TbY zteAVjR!WMf-F#4AgzPDoNxvw?MI^yyFShqD?6ji#=vjax(&j(ZHrGGcZTY0)6CP7s z#$;4?Y+5=v2d4o2XH_YOok;1xJ;x38k|B9?EXGk6&WXwyby3_Dbooti z5+h3Lrnutt%9tSwI_INVfUR=$n)`S{Zoe-P&=muqY-ywBi+B+7h^?132os|SE@q$yPZFJ}TwDyKohE4{Ed5PBOv+5;K-&0FL z(=%J?2jR_*6+M3~%fy*v6 zK*Z%M@`~ly1+E4QR=p$#rBHk0u|(ssRe~=^s&=pTOTfZwtCV@c@xd!G^b)Ut8Zouv z?fEKq;r8C36vOe_(l`7M^gmQjx%o2!va4cY;h+*V^r35qC9%LEM{c&JgFS~kn2!A#E zp0BuLaBzl(@?f}_e^NZ!=BsoK#WQ^6!BmyQPP_d_bAR{bqQDYr2;_?d zWXaJMez{-d62uS}ieW#PAn`+XC6;Sq)_C3<(LN>SLyse+`3tbz3oY**IjY`LE%X%h zJ=MiqKRX~+re?gzr9y1Ef9vf#p%?N^&N+cH_;!hOw~1TJ>5n?v_h8?J(GqF{A(ggaH(O@QDjgGyikyNc@jsx~lm zyjOVQj9rCKLGjoeD$2IwB8nXd53o^efFX2Er;K8ZDIzBT>uq)V?zy1X_vmXZRxB2M z_fjD`@Y|XJ|JrDb_pte%GWGz^-3d{|SH1hn2fRVm)H$2428D`&*M`W-j3O@9MZ}&S zq{ejj7Iri=hK@T?f=$)$KG^m34Q07fUsoQs-(RjMua)M5YSL~u(VF$~PN`Pb_gkw< z4gXW$Z+)=WYjt?Fz?4D$BD76OOzEKA!5 zJ0?XD=EBwi+ehRQ-%LtT=F1Vu#CN9(QD#>WImNDu$x!yZWLcH_%NL={{vx9KB7z3U zoi1pM9f3Lj?Bcc)GW_GfpndU(%BJKbpi`r?gp=@SS{6nT35O8*!_+YZ#yuoN2Rfqvlc=Hk9^zMb&k@IXsVJWBJ#745LUC zI;*lU)J};uf(uuRhZO~G-e{S&>P`~3qla-oZU}NgwQ7F)u%vXUpYWROA`wL}qv@e? z3J*mtJfs`>uuN6Pd?K`7OwG1bwvK{zWc2*k1Jvf8sT&MAcI*<~*de+w-#aK=2CifQ z{x4Y)P=12vW`8jA4BeNRVeogd>fKxwG|eLU)bfQ7gcg{4Y4&9*f0QaNnTEOea9^?X zW~5xmRD7gX0QpZs$A4WV(wX^&unz&%2s{vxXcG|>Ip_tjV`$DqP7X{EcYe9t>5uGqTQD~ldXHn`^)z7fgICY#d`QH2v7PZs&Xd*B00M-+i_${LbUEojAJD@xjiiu6|^8T`=}#T((@}Z+O1aGoOG(3|w{w z^q9Q~tJ;TsDMLpeTf9svF7zO$+W?Q^aex$yK~yArmo|~--19QOmAu3fu{ht#Cr|mX zq`8xk?|fL|XrYCAnAq5&rTl@4OHXv~C=;ig$~PaDHq^SV)~j1uI&R z)-%?--L=hbSKm^NwZ_`pEwxeItZ!^>)Vu4O8@)B7v9;AO)~g?u3M^U@yd45;mZ~|= zlq67f%)43+;12hdIAd2cfC~Yk%i?3jfAUupRcsP;#-26FMJJs~UJbhYYZ3JHymP8` z9^aK#3OR}Fy)!gDBg&}@!dwTi5$rkxJ`3S5g&L)Ed$L^;K{)inIVjt%ucDc@2}}z31b+Z0I?*ELM`VWn9qmhu-uq zZ5>x}OI4dIaDZ{P7;-YI74O2q%W9AS^8Q@?-jDt}$9ut9~v9P}5Dh_FKkD7k4!;475oN}SSI;$e=%lJV3 z)JhpSPRI;Pw=d^=0Q>~SHNp{eP)4*> zE3{jMlv36NzU_>koEY%NLrUjCeZrbd}?L&`Zy%#-3&KPA-e!j(HW&YZc~|V|DbMQxu6)V#wpKd_6wNv^ZHBE=!|x z2X|YXm2li3Y?!0IPhPh#>bi4-S~O z2-_^|*3txL%)Mxup}mVjQ!fq8EQ?`9p=m5QK%Tug{V87|=SGfa8s||@sU3b*Coo7= z7>l@B9K7c_!@I~`7vG|tOC@0j1HE^w$1Y=yfuuXiqtTDs3 zi3HEga3fQ4C*M>buFzbKC)^WC8*?b7MtALoyXoMc+fk%;|41) z=!Of5Ru@;3&%4Vc1ZnnN%Egpu62NbVFa^bT2K>h5dcl*P;-|l#fY)L#tVnQLci)85 z6*(I`ZQ(&JQM|8gHDTI|Sfcr(YL=;0T(0zR`3k<}OY)X!T%x$AVU?-fTCy7NlV*&{ z6sRp-0JlslUvkc#strc6UE+{LzS-iRFm#E@8!P-zoc3q_zm<-c)F4iG;ZMH(vLDQ+f=T(6h zv;f*M3?+Jxc;jt>kZuZa--OM?+Jk%XJ8WjUP$fFaW7_>34`yO%$#idK3LAOqgOPyv zMfQ1?o_(x~LfaWLrJ^V|mD$2j@b;n?A-kA(rlb>3@|(tkD?cf?IPJ}H2~vLbUc(xB zieYSa^ur#cW0DiO-bPT1C);&P{s&aUq0`bRa=~i$;`B zen_W2pj`yKDC7)Qf`ng5pnUwe%b(&EyL3Ox$B(Na>?$@%y%YZ9#|R9bL0mZS{gL=O9dx6S}%|a+!XK z@|s}y!t@`*s-g;^EpSvng%Dp)W4&6sESBh42F^f5zVf`;J zqFT_ts^IU%ZQ`G*FAhCyLT4}79T8kH6xgmw&5v2@nZ-Y2)lo?>KSy6D@%^z ziLxw;d|Oru*b&g__p^$)EIGx}4%2oPM0$x_=TX>@ej0mz8oi!#w?jfoi@5*nhP_z| zA=BNnC2t?oPjI*h7YE&^1)6%^4O#4wpQe>7A&_yIhR6#v=~Lq#ya`R zYH`*ASkGKygq1eK^znS2ZqQ4@Av7Z24h=+If%HwY_>xwuc+>47D__!VvanVPT`#@& zu_>1YrJS)h9(rOI4X@Q!=tN*={JcAP1B}b#ENna5_bpy?t|~p(7B2|DeA?Ird|AM@ zQ1ch4(@^?kT(%J}UbtbJexBIcmFfCp)jAGB>Dl#kvbS#{R}a8hhTHa<-i%etxJ6!# zH<`J#TO6|4qtaQNg&?2l=w@$nilzBQ?VPW$;yzz;q2y#q&`x`xCjRqh>>8@xd}*G7 z5nR)FFmkx+`D#tZfxv2or?xfu+Hg$cy61=FK~~H2vwW!nCgoQuWOjdH{(W@8-D!Sp zrBE76NsFKKf^)3%!uBMf&T%p&?wPVh!Gh6?oG6al?wO}L&)`nBdVOXj`&mltna6!# zIyA?wJaaDNV&IlMm6&jlMHk3&)9&Jr|jTGj^)u>H49#+jFJ5rm6>9W9QJm zv7TN?;T9+aq$(rV=$TJ!<^R#NEL_~jjb>!;!|JcW;lJ)g`S|e%)uT$lctkGBn=!>6 z9`V9aX4-9?T0%3{(F4ctQqB^lBq|y07iSqbdY*YVHSVD9nJzeIe9c~LtEOdj+&BQV z3<$TZ_F!y!{_!KD$H$Mj)$+mA@f@U2J3XjkCT#^VhsH`Jp@|ZTEi5_VdZjGL!q0sa z!Wp~2o#V^nI5KU`8tZgkHN;34Y%>Aj^+`mQs!=Tr0g9jhM*nYT6aF+_p7p@ej9i|aW&ylC|J6ZFJOYQ}53KF?%qLcmmdDlX z>LA_F9GC7!t_ZnbUMZj?_Kbbt-ubEmbre|@HHjP8F~diCYiU%vnRm;H=bP0}~p2hEfH-J{d}%1~eQ7}aWZV{J`I z`@UMOZLU=}l)uy(YxPEBqp{v-{H0o})#~fYU#g1+B<%+rebog}=Iw_jQ&ocBf0Cac zlx@1?UO965uU<7ROR*ht=oO8=XV+e1s02Y8-6t!SNkPw!d1OQjN6@5af@AOsOECYo z?br|SkTw~j1p^1i`+ZrI57nfn8hcoA-2MvLJNAXrA47a#nKp!3uU`FKrOHXa2xa$= zzrRuc@#=>kl;7AFVb@ueNm0G3uJPu9UZ__p74}zSMOm&_Yg@0Ywb#|g$}9Z&>8BIN zH{Sj9lXAt>tkNA1M+%;ZAqct9gxkg90M_FG*2@A|3jnM$0N=i@)nC_Y2;dLUZEM_D z_Rv2CXqBISV%2UD;_aZgEsOVqg0UFcM#{y~W=>`Kw;vky+H~-O%C5B)0O+?ZZGB7C zv_jJYYQEv^R|Ncfh6>Oz@UdR+AI<&UlM4pTdI@OO2^y_e)2muBE!S8PmMfuD<%t`-my zfpJiWNa^aXPdhx*pr!mmKv6&j@gKL(@J*((JYCU~XF z04qSn0I;o*{(5#mL%6Xjgw*Troo1aK5ri^6|1eOutzc%@U@p8xXBPAjRfZTmwN{ zn%i2V*R5@+h3CfG%X1UW;P-1yzyG1Oo(~3ZCm@05#1L*bIO?GaUAIKWgX zVjE0Y>Q`Y~x&nC#ACRIeVbZFMp|qL`enA0~B!q>vPxWa+i8pL86dG3h1YmV>*1w|G zN&g zhpMj)AkrGB52oV+g9kIjnC!>)kFWXeRh-sl3AM1v)k33IZS;!U2Ht)ph4h;-(if1u z2P+X;+;*jg{{cS2jn1aE8A zTHPql1g!naN-REO7fmP*-L|Y)CXiIMJT!@}xHX1phP4u2#@ZIaxKY!(4YdHHaTs~~ zD5I{GaJ$ytrYQQ&&3p)A$^@FHaMVVOql#(ekfYWGM{Nj>s&2imPvfZI5(qhXdIYMF z)5bh$c56!Lr2)zsC1kt7l=%AQ+iq{Gc>K)UM@iKv?#x5ms3R(B-zy)%3;h^wWnj~D zjem_zoGMMPgm2bhrWEYW=2{8e!rRBDSHk6JRMV}nHyW7s6HZvQEC_t@^w7|tOciQT z=7TD%l`?>bV5IS~9@lW(zG|DFvDpZe3nHRkLL}=|zHynPfA^%5dkr%0&w zwz!#twkZO*9uvS~@n0x_YeE3mB>}8uT66V5l~uaf?IDs_L9VJ^B1;2pi3W}O`ewae zoEdrh7!67=W1Yo`MTQJsX{2b5OXw)(ZO}0OU%Tw@+y4upjxJ`9D<;L zJEI$`=+yMa^b+NHP&le36h-wd2}ifF364syuyFA95#fLcqqw%&T+fe}&W+ddt}FbS zRRLw1;q~iB@{3VPgR`fP!5!{W0cyp-DmZA#pdHV5)!r7z2(%@PY;LS=*1N?$J>EXe zFHR(cOL9<{4h}fz?d$s6#jtmfI%TkxOPp?m3cf1CR?8>u-q@wRqBbq&qjeQ5&UZWz zAJ;aEdmPY~sHPi@UUj2*kjC3b_;{nZj^9XAwcjziSd4DOjMqj<Rl)ck) z<+8K8s+{k>KR?~M+{Uk0snt%qb8+5oUE(*?L9K#$9Xc+8XH#B@-FJLOONuwZqy9rf zW#^y4l^lBHUxJ6Nv$sg)jy>?YF;RkECw?t9@?l%u#NCA5F&!pQJ)T*hQv)5gH`r5Z zwE8~o50ou-Sj6;#Z8UMX95(?NXxNEs_6NS=JleSO0WPoYoBjkdp99AQ*`=-%Ku~S4;HbSuy$C1(4bYZ%!_S)IBh1Fq(11|ib*xnd zY@qmH5zwnR8~hg61=$`T$L2lphII2XzuuSztSEa9JJLTIyCc&50agQo2b(QkH71_re|#23%#R+Mqf`=>cyHQ3(TV6|E*s zAE-~`(s3$R#>}IM+=TgP6Cfe-cms2UJ@w2UU~^=+8g{+BUj6@8XgJ3eSI3Etz`OGS z>qrA26ZnRrN9eL^*nkAh1X4zNm*5OZe(Q{vlx19shQHjU6`AUE>9lS>nEDv|auu0B zcn8K4Kx>kh0B{dY+D*&(j0pjeCBbSP7)=8aM8_k}X(LLAV-k{{_6Xy68>2!+;Q4i+ zo**#W|BsJB2q|A{;kJ5qkErML{6}Ojj|Susw2(dOhnf)<8A%rS)rmuO0V3p%fnBOM;m65OP{5 z0;Vmd5eNW79iP@v)j^RwsHR2R4w?K*dTAB4DKem@a#m6Uy&$w3puyC_OW5U#7N}Ny zA8m`ywlXqkc^AucmQlrggTnSWvU(uA6h?D|%eCec2$SVJu7p_FF=%DUd@vM5h_@8y z030J72YmLtCx!z7I4)#TQ92Ywao7yGhv_ODipYhs@HjBFfusz8SiXa2qk-`rOd=(6 zF>dE%a-tZ3VSc)WDGE+zS(J=Ked|Edy4 zAIBbYvpB}{NZ%7;Tw|!3fqWXcG=rRic%f+w4cCCE$TIDFLR=TP1^EPnp%p=NX?fV` ztx7gBKxzUg#E#+gLaJ}0D(5ynmEv(32t-yIFF+s{IAKczIIyz_O^Ane?um$=9EKZu z3!Y~IzbXlZFSguTLT!8FF6a)fJcQpt+(nQRcw7`{AkyOrw?a^v%w4XvkR27u>EZCm z@3_is^#B#w&Py?CkEh!CoWuzYX72;F3@;gYTFZ4n8LuK0x~fHdgr(2`N925rZE@W+ zN`Z`YBSaM9$@e11fFIBX=b55FcgbVG|3jESBbpYzY~gv-RoP?(u8=qJd}HXzDxBh3 zG$C|jv1q}_kCu;lD}k>iBYjm;BM~l;u#I>FA6FZ*JT;9-+YE&pc}*HGG)=~nKtgn` zf*)~Beq?H6XY7IS;)Xa>eQxL-375<8%)YJiedb6bLToB0($2CI2lr6PvRYY6ig3)o z4yG+6aH`8ABM|lDFgB<%0ARWX@DsR<25E8tS{^49LeKcu82HD+VKoQv&CE4Ayps4a zMO3dS`{-8Tu-n1(g=eL7#>}{KUQG>VBr%hdHjb1 zif9Yo02#y7SyI!5>YVKZ0W1Qejw}@zJ@^J-W~SDoZ@6P2$8EBkALwFomJ=hUm~+xC zj6e;EK<`yly8i*xS!O%NQNZw4OzF^v#{weE{Lx$`>Vdlsoek6ngSuZMmf z7y-iq^~?SX8pUyaMwmbka7USYg`{T0%n${PMq*TTG_o+Fu^#>k_Tq44B<1dH_ zu?Ux2TL7Oqc~Ri_5RXU-Ve2YNyNC1-Vj&MS74mdI6yNMK5Y)bkk4ee#z@%IPw$w*&Z2CA=%jh#BKvfkO@S#r-(~5Ztj_uPTz&##nhy7?F zaVBC~f*wQiRDDcUevEL{+j6@krulGNWS5t~4e~+=Q+)#!(o*v!srTEQAG=Y~&LbJ$lmcbn&lX zY3!37hSS-^v7hM3nl!R&_#j}b!f%#Bc!~}HqWI*bfr9}Y6iG>7mgpsQB|=Y?c8Re= zkO9*fsc1!|q+*^|>V_*d(hO`OG=e5>#88B*yj&Q5mX&#g$z-{XCZH6vCzW6Yli3d~V6uP5T}@(H6~3O7<>IkH z3YK~?Ng)RUB0xqg=+M<)<0K~mZP>Cpn0|093>AXVivf$mP=6)SEYX{s2Np^PNj``n z!r&D>lqfjja1h;b8OhBDW<%9={M*HNN9IVW7XdoQP!UO3W!U$C5b~TTp2GBot{b*K z9tyWL!ZAXzu=r1qGp^GJ!6J!)hc(iKiLzCAwwUkNj`JTwOxC(ZDvH9Wg4|Y0)-wkn zmiUrLft~Pq$RJ}%&g{`1ZOO|`@!-SMUdoaY>qc5Da(XGytcGGkrKs&mMkpd@=K@ip z{%~k1n->C*Sgnd!;lS(0Tr#=R$VZX1Oc1HWB7q1&)+yNGD*-H44ZT3GqFl1WZAdiZ z2?o+k41cLdX@MljZ%pD|q?F8((pZ_PtI*TO5#xy*=IV9j>~opWjJsI`ro=F;3+B4& zV)c=|f8zM~Qm}eM_ND8vpbW*fPvIS!5dzH{gE{aF-CzqrCq_z1gRcc_fGQLYh=*!X@}qT!G^fv8ZfQjb z5ziOYnEN7@F|ZJdH-H_y+TCl~GAj&gb~FUz0qDb15x<=6Jf4!AoeTLEU( zb;6mLq*rt)O&UrN zmE+xWENXJmY_*Tt7q`Shd+m#p-45G6(Byr*Z=M6eE{~e$%KOXn_otm*W^LJOp=D4d z1#g7q0cq8NR%TdK7-biroa>BS6Ww!~aF6esBK`|Cu9Poj*+$O;p9rTb)V1l6X7?P; z48mll)cHCqWn<-q)?_ftc<*fmJ`0rMOGl>KH7!~^Z=>Z^3@pS!aIik$D~pny03$@& zQmRF)Wcj!aS4tV!M&B~~cyMWDHCXLljihpe%+FMQUuKR1=JYMIOAZ|Y*T;NBux=rS z^l=A*N2}xM^1-xc#C%{2~ zWlIU@z_6SyF39mtg@(qQ8^Dd}YL~5?Iu>}5a)=_W1S^0qBQ9QF=9bz zUL3g@8fr->t_SG4N5wV1SeU!qCcIE>;5aM`N}0~cVmswr!Efssq)%4)8E350!X`0d zX;7~HX!}1HMjN-5gb6W*R!hLHI9-cpp~!D}gK7soUr*FFMS0=zl_@l65MUfQj~EHD zP%=Om;Zy23oFDCIu`OveB=EWUvWUv=SEH{{k%nrN;3ZEdTtx{rdYCDa*nsDRF=jG* zOh2Q*GkGW6^a9-IMi0Uj_6B&ydP?eCb%&&hgmWEWF%;*q>xQdkJadd&tEqMlPol0S z^Tyo?cQ(QaO%MYiP6KEDQQ}6)Z46*x47_`?gLXA-8yr1vzJCu*+Bffzgp@4+jXL4m z7v!yb_>4e#4Azq1=c3>Xt9%Z>#jk1CQNdut~S6G zYsL)WVj}JoSDHihGvHanO%`oitBBQZwFi?!Y=PI0^}^1XjyX5bV;6~U&Oy2qP(^ub zRo*SCEMtRUL*~lQ*o6pIP)jh|#&he!$2V;rqmteX*e&pXlrSaWbSaglM)G-r%T-^< z!nFOUe3SHR0GVDX;=X4&CVWF0b|dB6lG~qfML}+m<(|*!n+va;(1sP)w5&rtmJFH_}zeQh%#|LdFI&;Pv0 z&kyW?HQviS2KOD}?N^k_wM=lM-3fXhV~^(xj3F({h?ERnj7^R)KbVS+6&_p1!-YzR zN^0=l$ZZpaV%eLBm2& z9}{!>xU$M(UM%oo(kf$c)u%2TY6dW`_JJOIML7)*YG4a;`?gxq3eRj$d~`xMqQl$TZ2FADF0xFs^8`RC4N|$ z{3U*H#AQ{1Vs{m&)}uP{u!4Qc^*c+L&GHN?H$V1!Z>6gq@HP!g4Q{`Ry$7*};hH4t z7O$%B(A5I5cBYLY&UO?WtE2n|Der?OOWb6(WO%@08}U2U=-bT-J3N!|Fn&LWe6cQ5 z3cT_^D9gi+j1Ak_g?Q-H-o-K%NjPn1Pqi$5KyX{73#U7v>a;;x+xC#HnKtc7-sAJ& z&Zo>KsG!rHU)rd~jvUZ!InUqA*Tu!!fJtzy2jdVl%CW#qtcjPwRP6hcv1M%!4DCLp zb02f4#C5wJ^jf2rvhj3Egz!s0{q*LiiqEgZ=5$+Pn{r|;ZAUl$VAPB?|0CFD@<(^_ z2P*$R5Qcqu^9fm>*NUh1c#SE`@cC|IQ#aU(b&!q%%T?*){z2PujhDZJLFj*wk~dml zFe^IXX<=jJ*Z;3=uCL4be+~41qgriz*Z(i^!**ON|5k#VMphNNWeY;TJ=ZjB9k}%i z+vW3P+MQfK{`~6APd~js3@n~39^j-0-{PGup51|u0#Rbs^{IRmWUe=t?snrQJ;_pJ>otP|F>7Y*d zc3QdfwCSfdVDQ_3T!fuHL)bG(F=60^fCY3(g?lwZuK*|K;;0nuD+_PmW7*qBhkXUz zMv%n(2qUZt$I|L8(}oZwVB7$r@SA|`lI(+9JZU+}8hGy*%l{mG;Km+EG}y*!*0fbM z219^;svn7cD@R7pe?6eXB)FlBPcYUH#$xG|%$AH`QX$jj5b#wAR+cV?0%jD^^(`rBL0( zmCalUD?5W6)sdzZ(xr_fp(%?3CioRpQ&zwNMTFsUnk>Yo$-9nlxXfMA=PNOi*#B@^qQ3nTFEBe3BG0oz+D!h+Z^;s2ti4r1yjECaY5GPnNO1Y3QslAW^N0gwYqy59EE}|!# zAq1Dp_GTsKeWh?w!~#*>oN5C#9~RXoi3;-s>7h*60N?aDQu&4L z)cHT7>TIY!nZxlg{wU;YCCp9mGqG3_1UGfi(Lmg*W&4c1#pXlj(W6~exB)lcI&+C!Mog?vc$CG!O}ui3 zZ!wk>idg@^Ewv#^#nF1ccO)1f>SdPt*}yNlx+-8`H$(ppr8a(6{O_m5Wq+sSe>ZCN`er=;TVG$> z_@4iLiJv9hTFF;oetyL&08|*y3BF!t=F(eLmj3v|@c2^Bs`76UnBdBc@&zo=n>UK@ zSzwpn=_aeML6(aaME*eT`UBYPj~e)}e9PqWQd&wGH-OHTFU-#i#=xi)vgBVk!AF_B z70G7OK|tXw;}4pt3WD(q0u%e*rSDzw{TDeaB6Z3y+4%7QpR6ivMa5!9iIkjj4Vv-8 zj~?5cjo!dNe-s^y%&}LAWB->p3V$w^i7c9W>>J#Sq)ka+r^3|i-vYF-FJ!bx(PN^U zkIVn(-=eE8&^lNUKb((5P$*fM7 zYTgh)=6@xpbs3kn%WP4bp0h2Iq%FXNuWN$w1Om%3-)qip{OvCvi)pX6f|sZ=?WL(y zSC~zOs?xFV`SRrC$D&M(Tj7!U*o%dkm*5Zk{hRXRs^ScSSN@u!H#ypW;Xwa9bME;; zb>+zQ=U2<(e4er_eZTVj`RA!==V@XS7oC+@CXUHXrBVs*{*+`WGCA=xJ&!HHACX2W zsSQLboYk(d4B%9-=1+2G0iMiw1N^`J`1im6_S?Vz{p0T?Ae%Y)T>!M8Z-nj3m*0Q? z$3JA)z65`zs~-H3WlxF@CFK+CDOCyKk4M|C@KjQi?(uf`Lt9SEa>KhsH#zW!VE#Ps z=s_BJIsi$oseE!wd-=y7SA-jt3ZrE;xHj8@&lCnFaM@W=+Fj5S-Dp(T5rG`Jj_=SV(EtP{>mN*2 zS)%jMOJW26I|VPNtl*KyN|VliLvN&r-YNQ+PJ8;SI&;F)&vo%rmTyy5&tei!8jdvs zJNbLWiv?v6N=amF)DxI-g?CVk#=S1KA!fNM0f$;>8D9%azKMb3`avXh0H$5;UFn%FuVowl&U$B#faz-tUGfdRt zKf|xT2SamLOZnU1%p5Ke@i%9cU`FNng^}$Sk!63L#lk<|>R=hQGv8951VzAtk>x(J z6FGzDt?A`=egtoFt>e1tM4lqU-Y@(&STGp`mXVg%qD9L}73_y?n92=GFB$@Y&VB8t4Dha+pc%r)DfBuIPl+FDgQPmL#G!ZO^7U}=| zn|k;{PO*W-W}x0MZdS5trvjzv!y3 zzT@R!aOgL9vi4_mbT-yjjmcsC?&k2bdc8Gne{wz_Z66NR>n98THgD^D-fiQ`yS+Jo z(9HFJX_L0swoe}Po5N3cSBDSX#+i9)woQ2FbGLCdxvgJ)Zhsne+ryJVcmJf;-QTNr z8||@vaBSXm9?kA>&%e7lHcu^Ihj;wjo7SUxy>3Il8|_ct=Go<5>#XxMI=kO%sh4g1 zyrbT?J-vF~I=g7?omTPt&5P>ZA-s1;@9kOe-rn}nt`6-ky>l4Uzcs=mjDG^Z2Mo@8?-JTvcAhNw&Z0gWt(~J?i=K55 zUYf(n@zL%U!s`LNtqz~RJlC_y(-C}kB)*&8j=_yIIj$Z@=a2Zh+NJq-Og?`BQ%b)V z@ZCk{3Etg1f|f5 z_nlO}N51%1zceB*9M@;y*b-N5sakW=6R>hB1CpVpX7x@7WW3mg;u=ISxM*9BW~a({(3 zPRJqhx*6Dq%e~Vpi8s$lAGN_Qo^ZZF{dNvxSvy?!!27j-aa(aL^>d3lIOHAFXHPP& zP(Hmg^Knhc1>oQY;3NAiaE<&0`Ve*QO`xl;`d*jpv_`UZz5V249{~3`z_@!{ZRgri z^2a;ej)wXd`6HkY(CvMf{6qBj{5|fU>>ceK?gMTo=bxBA2EWfqZ)L;@mzEQ!@m1h2 zU)@LB!x$G}JJNihqdlY<Y%ssS3Nuc_^ya z$S1ft+{O41?Q18rub}Jqp3WG)Z)h%8ES|e!a)Ww0#}_;aaMUqnoW8|5Gky(x@4oE& zzZWpg!V9;Pa=f4=cp)tonX2a{dmZJO*t-%R9qy#^5x1?=`6x0zmpK@}G1y@~VX8eN z+N!(lgdg7B1$-mUfG5sSXIxzYPxuGq-&DDe3FF^(NQQ4j%z*m&O5kbVXZnrw!zKA% z3+d%&mpr9iCoBlXy0gU$M`q`UsR4FvXUkPX|h7L z{36ZIO~)(3`zYHardy@Bqmz{NTc!^m&&((eIX^`69*oCxWIaO5$lPPJlygd{`i~B&gFWS>&3XAXpzm1jvc{u1fDcq6`6ZXKXY0qX(GqKjq|;TO-Sc6 z=C78e1()F*T4eLfb`HO!+pV~$$jd;yX6C@WzsGz(7MtCXyqj`< zCYTTSg(oWMwafH)=$6@ltbEC1G+**IhWD!=*L=?S<&Nor(N1cvGa6?``HS&Onl0w> zHt{Bp7moAdqCw~@dEW6o$k@eUTrbIeCT(tgv@dWL^&!(@JVuM0m=5Xb<>>?RA8O51 zeV=C65C_NcxGx8elsp;vtLpu+@KBdKEvH`k*$PC4F-_rZLHG@0RemUIZ$7ePD` z=BLgN0DhZtPSxYc`psE=Ypm~IjrHyJ#`UEAa5QOEwffVjYoBf0?OUI3uMfSutEaJg zU3=^{4y)}0uYb{KS=w-~ifc$m+pX){>!;dX=dpibU-`Ggs|kE}cy1q#?ylGGy9f9E zUZ*wGhFgAnTW@OhlLu}8@U}{k!_s!`=Sj`dw#Te%926S5^Jya18La+WY!Lw|;IK*O&d< z;gbdP7eZt-a8o>falwrLrbq; zdEIRpjxGMT{5;mLU5n%Y0B}llz5|@XZ@>f4aDTnly*{)w`*_USLEpoxHEn-uqHni= zZ_eSJyTNV!vfsHn8~|P)x|jT&dmZo$d`IhxtxYjkF($`B|1!iGyuVdd_kk`4ysu7c ztY6nm-~}0P{j&p@*TL1KYajQ|I<3hq@?O2#?+TujaCKDUe-lrfIlo>wK|A1+E%=u` zCy6I6IZn>&@cHI&phNoz|K!g9G09&5V-I8v<|TLx=nC(_+%y0~ z-|y=O`a^qv>k;9AF+ZpAJ;*ZBdvM!0<8lPJ8d_uEiFH|~Zi!C>>h^_#XJ|$pQKw-(BBTkFEzWr?b9Rx9;ycFc;tlq;Kkb2Z#7x zN4?e^eY@shyY|7!=x+Z~;B9=jm&OYx4_*7Ds@YeckdD6s&Tp@Qc0-sO!t&YaUk&#> z{rb{t%g=DU@YzVh1O3w)S3r|C@R<0%#rTW;?c7~IdEH4r`5u=6(3x%42Kc1|@&NzZ z`zW(}6GPzQ=6uwxuZ`P#x&wb}H{1H>_JQ@FgTACS_=~spshH6C&x zcP<*3FF*q`p9X1mGDn6Ey7jI5TideGpFq1H;e2rTITiMZt<33rKWqo{owU}wjZ47W z)+ZkJ>91*nopHhMYP5In!Dp!UabFnV;=aARZr#ZfLC`uju=4G2Z+H`T>2{5#R#+w{r_VstA^ue<%LPk?8}Cl>Hj<9w*z3?RO5ZngKk{$ZoGb#qny z+j~>%-(2{yd9-YVm+R1^Zb{b%5xF?BneIM~!YBCw&6F5b#N6cfMdj?^9DMLIK2}0b z#~?GGF?IqRCveo>t<^M)&4!l|`-Aws1%DE7HBoQwfM>w&?(cnunDFyaLXNf~aLX|t z#$gbzj=7)t2%n)3!272le%XxAJJ$vY8xDHlw%+gmdcgg)s0=3j9O>Oppiiu9eX=ge zF7gNWCBdgOuAi)l1UfECzor}DAXDzv z|J4PX_UpE0hcRmcMu6#VfHrT+T&n89;e$SD0nWAl`OV>^+h{wt;A^V&^#>hfLhuU2 z=tR>~+3%0w@M`OJ`#z2Twxas6mgdW++um$DR>WR$JJEW$GvhkE1+n+}qYiq2e1&ZO z&e!$(K@Q5o{FK~J3XjG7pipmt-^S!*Tjcw+sQjC8{mlMd0PNlCJ@07mDXy!y4RQK1 zUn32f9L02Ed|r%hyP^F!kKmzqRW9}cIT`3Ux9i&H_I|C_Jvbj>o=W)Tz|+~ei@lRt zw!>m-k?XZdR6%V_(16V&zS189vaKQ#x5c`N(;a}Xn4`FeY&+P|(mUbXw zoIAOH%*A`cerYJT;4c~wpB+Nn#NxYFUA^Az-)tWaw1bvsK&*v+0m!L!dwsUi-X9J0 z;qDl06Y#)#i}Lg~`Br-x_@x@ynY)84uxr*Q7K5EY?0%IIOQyuf`MEUm1)_YN>;v=& z(!QqI?Tz*x;}66)#Fh~6@SKU+e~jxslH=`xhhq?3w^8mz9)!^_!#;ij+cOErz+BmY zzJoaA5n_;Pe5`=~WA@;-aW&CCMdr@uFZ2`G@%;htJ?Ni$%+Jru-|dO^VN84*@r@(C zvX#gMWUWc;o?t$J)(^m6JnJ@ejGZGn%kjcs`%v z9_06H;l~F0VLdJGAs-F&st)lE+A7&+x*hI)zPrfE1H;&}=YdmsH_V&F_zHBJ&iM-3 zMDiBk`;)B|YjMBs?8bbW))3~^|CRMILcToS@%n0~`BwM_K<7r_7f+h*ul4(MACAdU zIA)krbBI^XN8!Vm=;tkx&%qBOKGHECGhuT&i=JOg;dcwyIwyA!Ljz8CaP1L%7+SZX z{($cT8wzca_n{4=!NuE+VC^f&L(~Swz6G&=EwxP|PrSR^kDjq>H9&uSQnyw>*(jh9IXw(&sv1escV|?93;rl)}!_rXt67wOFTTI?3$BuGsHavEtZ4rq|zyf`I&qRU3rzmQ@efe zKOdP6Z^dl~^X19^M!9&5o=#3~Z-5R5UjMqj z^(d{E>k)tLpo%(hGm@iBo6G)|&GK-2xK@yoCrtQ;BG;45tMm6Ru+Px906OfgzvuLS zALHrxIyt3N9m&<2)6n&^0L@dahuewne+vkt#Lc}2Jpn!>ko5q13u9K=?$^A zPd+o*d$KWy5dQ>uo_t#FlYhn6q{4OmWZs#}66jG`$NjpkgS|h)95LCnGkE@MMD8AA zz9Jv1b3aPA?FpGV5xHWO`6QS_O40YY{<@pLe<9=#px>jz@e|r0GokBvjsS2J$X^JCN2c@lc!YVDTtqAVUjKGE1(S{3vn%yAFb zD?Z)UuO4-#PioyE#p)ERVJw^BLj?HN!G?lfJq!9ppN{Qscq_|A8~lJv;J;kGwioV6 z0$imx*~ zGy|FAzngy(c0jUO>9G#9({N3c=>wL}FbC0f@$K_XrXQ}h(7y&gwC*r3mSSVW{SNSq z+w0zSGajoY)*)E_;%S8I1n)c1_2kfJX>|eb`e_;uT+_Q5@m$a^vwa|!w>S51IbQzu zYkK}Q7Y6c8;JLn&8~b_c%}MphZq>AUKhUvBf1J}w_VcPw4|kLGNB!o+5w;-1?+x-W zX>0BTk5$|H+Sg+I*Zf58e{t|ic-7X77rg&_t+BRVP2B&oxl#Lm|I17Kym|9R`MYcM z4A%g<*Y!rM=^fyB6N`BHj1AsvJ-D zOxN=}RF!a5VTH_A754es^arQ5H94iStg7Yl3&*G3G9G{;)m>c8yq-Giw%^t8nhh~t zMY{MX9EaD~6c^Pbp~41O$~tzL99<*Xw5$unBw~%1zB-=Z2T|>h-v)W>j9vNbT9rSz z7?@t$+sBHL^mQ$~nmaNOs~#*3)5Lnl%_Y`L3qQ2@hi&|@y(HhFh!>nubxU5%-3x1} zVVO@VlZ(^9Dv~%hyA~8tP@yuXp5gn3>#?G{52|JAs&Bla%OB|SQC|0#>c`_nq&-n6 z&d{(g?3)U3vYKUdm%yXxMK6Vq-9*h1%V#Sty6QTPCDlyCkA@nQVS6XOh~AFHDoabR zu`j~6c^Vs+e=El3AB&A2={|tLl*z%%lmD-%$N9e;vC=hg(t9!3rd8?|y{?4N z!`H=NUk>01AY;!~BGYlW77nz~Ki^48CCV3u9jQ!;A45Q7mG^T{bdg=eCpElE-eruB zj}3p|1Q#HN0IWozNhm?46%IS>;<6*ao~v3H&I#b}L0sF*$}{q3cvW6T^KI;_>=^V? zppBeSGp;tAQ7h#_(<{R@d;F?FCecb@gz?r%8?R#?;kC;;)*;8+!ZgRS3~kyirVPk) zqvy5l?eL9cHDbARrw8VPSK(!a+9Sm?J!bh?p+@#RxKVQ@^Zv`+{@JY|ps3OY0{#w$ z$z*T2Lhg!;;8d)fk8Lc(jSRXyFtmFV*#t%|5!t?@JTThOFJ8M5p$}_%4~bco;Le#? z`C58PUJjS7rf9efuhayvtJpzZOo=`<{>jWiy z>lFL^C+XhcoeZpsm$${55qTL-Fl;z*Y}v&r#G6w&_; z#Sax(+MVqJW$dQ-;O4sUECoXk!oJ#YviA;I7&OOcnCB67~4tQYB#JZ-KuSjVUpmsk%= zii(&J&rMs0cti6sj$*~@`IQz%aQCEXKREZ`rYR2$d;HZ38^^@z;7d9NW(JZCAzMJvsg!-*rIoa+dNy^Ql&6JY;;K!K0}f3Ga9SW-9p>ct@SI#`63^b;UXcWnw%PSCE~w zccus%li>@O=^GR8(Gc&^x$1d-Tg3s@E4C$IN=6lDQ3>|j_>Q3Z6Jat01*Di}2 z9^ZukL^_m{AN=BvF6MG7#40;)~U+@2C@6F%S zNRma-^K<_djAp)P`;J>?k!)i>-MIn*0tsZcVwp3qyQo5dC>B#JfcFH!DKce_AU3;X;(dby{yMGpe z0r3yXVWTTQ=>20YwcAPPz}%Gh$B8Ci^r902qUbzg^`6<370%cqYHL9k^RogiZYrb= zyPM+?|NTk*@HCT{VV@7J5{IB8ZD`i2CN1!5N{F~(au;um3ojFvgZHALs>sM1owMkV zRUtv|?23UMYAQ`yg_Xh7T96jeAS!s%loUD^6D6ObVh0i(1e_+M4mJ;&H;NjBolyr< zSXb(xvY@{_eYgU0xG&#!8xPmxVsUh{ZTmz2#M!|%^(kt^@MaR%n(ZS`U>2cHsOw!+ zr<%Luovy>_IHl->){KDwHId^A1Rhriu5lwDx>QH2p{*Nc{n2pUeSUuZ24xW%H#Yqy z@!B8qyRku_zoAAAYiz$woS&bQPZm>qAG+A42o~iIfyP_ABBl+^a`x)=Ps>!`llW7O`7~oZG zi~w+B7ePc#1O%a#AY2jUiefq}8;|NCY&=x#7=bI`9M^4I7?%=olPDFvR7XLTi1I92 zqD8bdVS~NkP8>?AS{O^roZbN)q6u+39KOZ7sOUe4(n`Dpps8;Bp$OhFXDb!pGrE6iWDg`ZE&Jz?slzPXN1{i}i69_(O+5wp{^y_R zP(S~S`pkBM_Y$Euf`dbD6b1eDjebcUQ5<}B1^JMh9dsZT&_s7i0EDJ_P&Dv8oKrST zopvluJ@{v|&tVPx=!B%OA`io2R~46GPn7R29D47&Px@z`9t{!XvOaR{B)hebTu%v8 zK+G-BG@_Oj{7|I0!ohSNr00~~+_J{Eu9~KLck&4DDqwimu zzf_eLth1jc1OjLHj}uTiB9@B^6#w9Vg`4|Qb9D-Q&`+FhKg(~yfFOvW?^JbG#{p^h zfWlSNH=}Gsduum_{%{3)U}v!st~q-ExU!wKDq3xF->&+MZ9CdS0BEW`+OLP|6TB>4 zf3kMQ+M}_p$#(*{_6TPkdIaX=MjL?LYpy*cDAJ#)zlWX@D!>bot4g zs72bd;ZA$7@ics}G&tkNu0LF?N&1TR7?yP6sL$wbr#{15skP0P z!=vM#zdh_fbE5#6Ys1*S{yQv7Z0^jL9_{RjE^)%b#Vixd0ziMDk>1eLImp2K@5bmI56LXO8Jpy}8eX^enJ&AY>c1&AJ`cW))IT~w>0uN9@5Ls*g6>c4E>E||c*BiPw!zD=h z;oRA?VYl=SQ|4_8Jlg2L20a?EGL+I7h;e`^dl+-scr3dFwH(wEG0_tR(A>3GZo-=k zR`zNi=e>sZP1gLLwl+E0Y;r|0S$aSPy&4l>^M;An{O9@ldHsemAj+!6#`pGthR=OY zXT+)hR&??gH3s|WH;6~hQ=*3y$Kfz6hBpu`KFjC`zCK~#M6*}RM-Ja)awI}4mOX#` zlHP@Xz63#t_i4X=L;ZlnE4lE`=(5oD3VQ*md&mF6KK?`&rP4g-4??4(*NAj^{sa?q zR{Q08amKnwO5y3RKnY_zefgfcn(0&wn0arfT|1r3USzVF)G+%obMfe;($3@Xaxl2~ zFc`R5dw7w#_?Wdb$q(uG+4t$e<%jo=7sE_8n;BjvwJb2!u>&BQ?3;2|kB6Z;EQToj39%GKuj5|As+f-p4- zXQ}x1c8DJ^L)G+=BsbZ_lu4zNIH|zLN8~R_{}MSVrb!10E8@%Yyv84*+g6V)1#3fC zSF*|!&niAJ+H-mOI<2?JsiA6n>$3P*TcO`X7e) zx{*H8NfKUT_Mf;+8#p}zII%w5&=|V8J^xWm#HTX4eN0xH~C~7 zJ0?G)wh-x4U#LZ^AD>`<(}n+Rdc^@!Uefj!S4R!UC6ughy^S-r=OYf1+7c{w%a{!$ zWC$g3qTEVsF_C2>SJv&#dND&28_gveF4_2~gxg}4l20~z2No;FK$g=(=k7HhMKTji z4EsC8B*{ii{c;YT7#hAdck?!?3qbFSC#RB$?9_f^R+tnFsCjvD?sAN(zz_d*m<9^l zA$s>0o6(qfHl)$Upb!cPMFD=Bn2=LQ?!^DPvBBt`U_uY-l7k_o2G<58(tQV>IW`(e z_|1F_rqo*GdPu`i`eX4q@qI)BNPvMBeAWcGJr{U0H@pVL&_)9>h!mfKEE1-$bYa7A zL-*E?7oP%kz*&sYC4_ko`!k|3&%??=H2D)j(%`*d!nn^h11_fM#_?-qUP|U<4*sYy8Q5oc=6Dm257{P&zg|FixWE&TI^X|B9`aT zMaT_X^xJE{%|GNS9+6R){VU$YhXxQoApUY>y)9WoV`i%s)usG<&=o(Hog$%7{OaSz5@ z&i2q>?iPVx0rkz{YCCZhOH;|b;^!67qIZ@XJU_O^d`B7!Mt8&7_NT(ex9|ujgZZsU zbc69{2v=gi*sKyOWC-kUD>WuoH+DB0&K9dZ$#9+Fho5-Y=vH`rp1w?M^IzI;5UbB**KZR9 zp7;2FAMpP^20f;e7atR^)5m+v4cEIN>{iepS@RThhg6Xwf5EOzXrFg`k<0?NE>7?E zBkMMkjOjKY3)}@6fx0BBnM|rmL_9)yKg|&b_Zjc+vA;mz#ook)`AKoD>wCdkk zZvGMJ7eflQXPD5O03nvBPI7PP0V^`gC^}Up@`%n`oCe=@2qJ(~L2LHc#L>B!i>UbH z0<&mve&0ald|XcK$Wb9m=Z!QnR#p)|6tt!=hSo`#mLvO7_(SXFC_P8^s<4dK>uEF{ zJ#m?LBD#*J>&UJZ{`o_xA67x3eoDze*YP}nu_M^CKu{Bz&ogJ1=wqY@5Ycm&7*OfI zO4#eQ?TqPhMMAF(UObL~8^U=azgXeEvOsMTUA*c5Gw51!?uMrEF{$z}|N0Aj{Ex`| z)|-HdcH<#Q%fV?}OVhwTERo~W;5kcVkDCwIKf*o-U`0WN(MAO>8g!NRMfANXdCl?A zDX3$6sQ?NTipdByL7R<}D1S-Vt_x`OBN0cU?*fSarC}I!A2N!>S7c1oVSbRK2E=TVKvSW10&AX|KtKOn zU~ka}L(J2ke|{T4ZDW%%vsS&mNwX!_w%_e4wXF+=-L2_w{IquJC_AI0A|4$$QB^BEz89`A{9 zzp!fb7H?!qUci3K>6M4s0{aXF?RH`l`u^#p%Swf6h=rrrAbkpMRkKgmX&w;-DpEQP7poe)?(X)2QFs+r%&2U5EQ};#Uv_ z@7^WWKG?A9PwvD=ru%`&4#HhOVX*cmAhVxRQdy-lQ?aKr=!$;$=*w*%{ou{gUXSH> z_&a#JP`+D8-_dZh{FcSTMT^aP;;As=li>Y;re(;rp`>6mefdhXUa!!!cB=wRBap-M*zV-T8W(d>*Sf<&CGF9+WmJ#QY z#F0}oM!*GH#W;nAc}9Xlw{i!*p#wshaxas|#A{?MU^f2pFIRvH_TekJEu9MT9?~B@ za`cMEm_+kn(!WNt)>a1<=jtnE?joluF`PbGt%sB6O20dGs=RgNOjVI!oU2-$FLJJ- zs(!&-wH{8MEB)@&x$@SLb5%u{ajtS%!N{3vr3iz0Dqn|Y35?C{Xwa9PDb|d5^cFj6 zPQQD9k@=YZ@a{wAL-z86f*Ph#V%GeE#75T(y7Qf5I9|cnKUpC(l(+vn6>$jmr^Kto z-`SS-clbAsbA^x8b%{oXnLW2Rf2%@Ku)0~!XM%vJa(mS#F8QM=}1$>*f`c$ z+Thiu0UACl&zajc+&HvM^U_;=vgi3+a2;EV*{FzzFXN#(quLCv5M+^#K6Sv zS@JObmO7i?akJz_l|aLIR0)^W^L#}zc3-^>y~~mKSU>>b1&9LYDhklg@$-4 zxH7E{U%2BHV)bgLQRrn#5J8PPY5pcn-=xEDGW1QxK#?)GFsEf6Tb#SQdOrv-$%FV$0Va z>yv+c#aj_qa9o+)z&9M%N_G~<_eQDyu6sNjGXkz*a^+_-!*?@YW~VN z)++yo@r@#pzg|oeSN~hrNrvk(AMQ1D5NaUA1*iCPL?`qmnQUa?WD`zV%n-eYfc$7M zxeWYwW#UTCu+hbeqeChfHT;p(T@!&JbqA0N45OqZ`D?ak3YU_d8{kKM0Mdo28n7n60T2=4!VD$!{$imFTG8nB%$|~9*NT?5;uSIJ(RLuxSH9d6 zAa0AYk?MV5ieDo+pV?>Pq=pabDWP&64)ccd5sV7&|92wA3r%tOZP{8PE2EW>jxg)h zTF@X!b&ri+aQfSN@=ZNGhZG65k7t8`)+$_o3oKgsYZG5%I;x_T#+JMeO+%&ZkRvRv z8g|5lq#jK@h09<^^rLf%vM)&VjpCLDY`L!F3yM%`YMVxSMXR0h&R*$+pmtzJVFW*h za2Z*nJJjRiSXU7RydyBFbfA=@=*-N8%=NjU z4};n`)baA>TW1L!oi8{3_;tk0jNWr2YM5qmjv*-cPx_Eem$nCEnRAqS)msijjn! ztyGz(W6}!pCNn~Yn$`0#h|=9+<+-oIK&oS1>4oi1FF|h@^ykI+ZQ^gg@D}F`x?g_| zgQ1LYr40D_kE~)JSGL|*k3J-B#T%H$NG)jpt60gPM16#K7hj&Ug~tP3ie6@@W`DG^ z#MKo6DvW=9##cHHB7F5Hl)XO|cpy~qDM8JeSLK8~d+@ zMs%ZvLFS}@GyUY^C7}=nOQG0;{FbBnh2{JW)780-Bn#YQ^m+(Z?VcPOvlH%WGN1m% zAQ!>_T!n!W(Ejmt=uI=m=jXOsT_y&U?_HJN01|t1F5glR0ok8Wqdpp7-FWlm`t-+{ zi=Qk`eF7bx|C^LjlKauPi#N=Ck`ES{`Aa3ZE0q8_RUWS&uN8$4tNMc{=p6oE#z#;Z zK1!n>Je{jGDZ;wCTtVJ6?73FFBAkU_8d3T{w(8&!Z`!M92XFuO3pV)mFF(r=%jNr{e7i52rKuWy@Jbx_RYoIu zl4LAV_}&=f6>pj6h^^b}S1e=CoGB^KMf6~vPkgm}9ryBd07)S-k-^R#(>tfPAiN^W_)1v$$8SH7x{z->2z?)U%YoDZz10B2%G@Gko)XkLc_a0T0D3s= zbAsglVNC^k=oj~BB87mDeR_16)M<4XJVaX9Dkg!Z_Tl_|HZjQi@t$-GD5E%MX;S175LQc_^+wP@mEg~-hiMz zBK70dXXFk9^${(2u0Er;An4Cn6?EmXxCcRf%2rc*s6C+N(A7ueE(G-vzYIZn%5FnY zpV8|O!p|hv40}p1L{OhCbkxu*5tK(*PhEW=U5cQ;ScKMCz7|1y5pF69VJgq*%?QdP zel>#n5bs7%pODKDltsp8GZ2I{z6lUpS;n8|Ahyv7;`)YJ6SPwr%eHo#lV)(L=n^(GwZB%O(4d6D^S zzx(A02JdxHAAvMEX@1g7h<~4q{3>En-|b!olDr|VWH3!e={5qK|3McuglKYX`&f{J zwmPSEh;QN9>sJ(3*)I#)ce@+}k*kVNG39GU3V5lqmO_YehDI=j)mXz@NYt#hw$?=Kh7g)-2J&c(cSI@&&Gnm|eY}@7TKh^(7PC;vT zR2V18dU0WK zDK}C?u&&f1`rG)E+S)LNUQRplZM;=O_}-4)ig5z6c+>DQn^)w@yi%Y4nCmva^?r>o z9jOue(1jNv%&F}YR|!*=g3?;eK!`~(h`W&^7BE@Ty%Z%!$BE(llhJ%>xE%@zS) zIBKUA%qWm*a>ykBoA4}5?2liyuK)WbIk1SHZ$jjg)*_BwXa=BcfJaf+z z<)9Rv=!ayPjTUQK`=io)sIl@>SjaJ=zK{`e)72gNJjlay;{_VO)9fbm#F=rtv)GAK z=wtHkX*R-Dg3jpWH-4z3NYe_~VJ$>N<^^PU_VUrss7qptjzsuGWIenT7XtQwrvCL! zY=rdpV(4)&%3or*mjKR!57C#zXha(+SH4wlh!az1hF;I~snHtcU_8bOf{|dt$?*1w~q=>MZU>1aM z3ZycKG?I;RV+o(XsoMS@TV9`*PGn=52na+xBK;hCJP!s4uR#FtRRH|wA25yQuL&Cd zsnRP=+Ku}w3?_V%E>C%fr4K)&H~;;`+u^>F?sqE(yOZ6NpB9Jvd}U^Lo;~>Yq?gXF zoznBN*SUP^H!r_Bu;G>GwXNH&JoT;0c95x09wy}pd~+CNtbH$S9m-G3L3vi&4!Swt z?i4q@bbI68Rwv!&ZZen^*ZppF^5Csq_-5Vf=5}`Hat{5zFF*Mo>g{5#-h5uxr^TGz zF5~YTds_D0WFyyZjq?vlcz^Kn_qSdi-d)z8*13AS_P##ZrSY5Elzvl7mi=M7lB;(; z`b}n;zb|<=@NQW@kZ-=$_q!Dxr;6X)+S97vg7I6;=P&U4%YDIxc8=eI?_2w4{PyO) zl)`b>^$Gi3s6iY0eJv@zZ@}*c|Gu9DIIOB)M>zJ+MR-?a-}!B5-)@HbDh>-(zX|U; z&F6l-?e%aD&1v1YlKfe*|B&=xUb+1JO}_xYyY&0Q2l(!$lYd?};QK+lOvi1lD=_B` z;Azz;6mu4xPmbUw-IHKjcJGVOuQl}>IM(EOi#UQY@1ebYU&`YA`}akFr`spEZM5qg zR?7e@JS$oR*7P&1TQN^@8^GGmKR@FbEddj>O3o{cV?oovhxY}*O}j14r}!1-Oz57@r{MS71phey zak#yg9{`P$HSV~13P(ExNBscrD9=67u`A)R+kOh>bBXvK0N*1%dMcmc9Bv%oZ zrsFl&hQ6#F%p+JAt4`?()(-o1fyec=uODiK`&$cPT!CD``Ocva!}x7=zMXZ!FqaH` z8>|iBiSr}l(Qd%&Rpg(``XpPBeqS`F4&ldU^Vx&89)S^foXIgpCrtjpvo@a#^4$UG zIOq%Mn6@tgoSim@0cF7xojbtCXpZzRWEt|8FSoyE{6W{awFVhhh27)12JdRT4;i=G zm<-=Flz9~I$vU4WZC_OQfsPr><))e}b3DVGQUyL{59x*AzBXk%qV-F8B>1+P;_@GH z#^oQhf1-3saf@^5wXk2(p5Yz)PpWv4+QZ!0-a+W%LkIUVkl}1!VSOmLRmNm6wur2! z^epD7(vLxok@a`w^{)l%56?Q3j{AAOKbrat@Lg-m__kDh?3gNc6yyAT*xK+nwJee%s45oBWVxFu$?p;E5%lM}2pOM$U6|6tqmytG8 zi{Hj?D$nCwx}@I>$ljXEO3PRs7(ODGz9wO+sE9fjWGSja_M^yh@M$oS$GbxSD!}R*yWuYvCWLjF# zv1>XlDSCRCmWmOwuqf8NXQm~lmqzV9k}QO|^b}fZQ(2fSt9y_-&o6-vtXaRs{AA0iXiR9A=fHTP+ve{7!y`e$oT-vv4e+8Fei!sn_EfVvClU0knG z;2KkXm%@+hU>C$15nL#H%wdgo!p(3hbbA8BL)ry>vQ~+e2}wzp)Ye3n5%#oBXt0$x z>MX+6ZZli^*cx#iNzv7*EqbG^o6H9UK0c1HWej>6!octheb?^Lo_uI83$X9y!S=YL z_PfP(XJYR+CcAwD=24yY$nR>h=RXwsXseW%&!EI?&u8W{*u(l!`Aclr9^n<>#T4Sh z1vr~*?Ff&Oy{OjaHWaRFGtXhCI=r-gQ-!Xm4RlL%*R(7LY7fHZhjnTqTviU|nFD)1 zd&6yO3fC@4{2K)VS8mAkmL|2Y?}Z&F*^X3S$mNM0i?Aex-7l}xja!iMO??8*Lfs!E ztz08X{Sl2DVmB9cyP4QiT`N!R`|-`gVGXj$x+TApBW{i6=}Ez3<^HAu?+g3Duf}{(lz%EzZc;wOwYMmalZ~c=69RK9fBYHJ zy`{**q+crlEw>tZf#0O8a|L7fn%uU}5*}c*$oi-2Kxw?E?BUdA-5q~M{9kohU#Q)K z)dl!T2l#QhuL<=7|`>+fhOe=-^(z;OZz*-0yO8K}ttq|XekmI2I=M8dUI;56O}cwr&Wx54=w_ZTJ*?quDgMRnFoAs3R+Z*qb3RR#K5 z0c`jBeE3?@`BbF&WM!X1k?0N-Uh1Pt(|xHY)>HDQkv*V~YY;UTs^_G~`DlDpx!xGn z2j`LJM&3BztvX+i`iNxyvDydn-s%^K-XgyzeOnhyR*l*G5T+dLyL4Y`O0XGxgY`@! z(9e?Gx7_dFm)sk!*Ec%jyyW8z_MVWFdRQ5*Vvx&p*Qsh?HbW9Eck9P75;0S zZ&mXDcKVyLr=m+L#Rg*{L(nQsWFsf0OGys!q*x zIqK_FWQ8hk6XM3&kkW?kf0A`Sbx*1Yx+J!mqPvA*qw;tk@^2}A zxxoJEPgGk(>SGeSZyM|wDhKLZFMI($YRURuf%gOY`5%(mTr=qqSs&{*(c{8S;4-DiG%_;y(*c0@J!4s0N|(5CUePBtGUx2(=H(5{ELUs73K z`wH)$v7JNr>>~Q;agFL6MxCxL%a?g$IJItN->7Bw2go*|Mo+<7VLZg-Bj9$P*jr3K zYB|27#TX?%@iji-eatzIC0b}v|9&waH=*eAjLKI6tBk^STUTUN5tMO?Ij(GZlXq zlXZ%WF#6RQ{#d_?UoA4;sI3c)S!z0+ye`zov&{4OB$I9OT*w;qWA!V-&vTQ^u>+Z- z_)S#*pe6GI`OckIH9v|;4x02<#gC=zD^eUc74WM`r%~3G#g-!X57`&J4}8(lYpCSs zsQ#X?uY>sw0w22K8(})93AQkOnf4`Z{O~@k##;6LE9BQ_a_sAWA6`=EO_i<5P>eMk zyH77~ej9Iu@(`#VvCl@>HirE}>pv9{P$ ztNId|Z5xUaRBl4JLf?KV3vE2^^9K8E4eRIL65oAt#C`KLpM~@@&NH75^|f?7N>`nw zk{4y=rMPa_rFu;_SJ3!Qicy^s|4?$Q!v1TD`?RiGsWDud%S82x{*5{Bgw8{WrSRR7P8@7r|FJvnw!HpMPfnXucTE?Gt2d6N1cO)(9ITMVVnA<++hDxc+zB})7V#JyroF_w2yXevEH$?cuNo$DjxRqk0Oio0`lF3|$Q&or8V>(

OvRvMhYjifmwQWIsuuN5=Svs7)=y$ovSzW(nk7SG7N!2pig9zwj6ylMj^Ugx?tV zJLF3_XN~DsbRWA^#%+b2~!hQkKMYoKe=9BX3Ru)U!o<$7~EJl2P7qjXvBa0HA(7fK_K_LB|R zpD2&E1NkrfkVH?L>Nd73$^TlQd&+dg^XTQhN%ava^r6HMLOG|kbf8BG`0r4c10A!X z>v9qv+fp7o#+?*?V{%!^RcDWo?nq>UHEM?nw4-!<0y20rTQ_6XA7Gq2kRf?i?nyLEz@B53GK@oeiT^M z_(wn^gFwEs93UmPLAHVO8lThiB1FcRb@4d+tBJ9^X_WktaxYuL=c@K?(7&bJu&;W1 zHP1}SgWs!tgzVr$O}B$zmJ@elmi=npWU%jaTFeg~n0zRd0U#?VSKB^ z28r+1#&Z|MS6wyAUA8vtycEqRvkN_T9;cwf$$Y(r7!HkFcT!YepVluM6JjTA8wIhC zqpSv9xlYD#3r1Tb_dsl=Lb~Zu9VD>*bo*Y-5us>OnWtp>w6@R_&fAR^={JN;^h8yPjv&4)UDJy_nPAy0|v8sS)4JZ_2Z(_%3x9q-70bY2||4th?D z?{_D!Nz58Yj}_Bjpkww=U*kB~$$q89;*Y}4VoW%eeR6*>^5Wb2qdI^VXFAFY-!>N6 zTUnm&>0^D<8XNIc1HFjY`j>d#^#S^NC@giIY)#H3GJD;bmSvk*&POb^m3>Xl$Fb_l z{x0dW4Qs^r{7`?Ehy{fD>+roZ++Q!QKPhKk>2IR=#+CkJ=PTI{N`GzTJfPB_h=Ydu z3;Z3S{_HsTq}Z7{-@L3hD*g3DK4_@F>p1vg*7uwG`?mE6>=1Q5@^R}CO)oLi26>7#CK9CE*n&r{1W(1SYE-CIKRhyd5R7m@`VlzXAzLs2gydR z*^bYR7dd9^d<^EKwdmP%rn4)4Sjq0W%xn6*67P&T%V*Ne)22%_MRW z(U;*eU&fTj*&0+YRq_y&b(ZNuo1?yd#o<);HKU&l6WP@M6_<%A3zN=B6S*oDe zry|z4yFi>hu=6&UH%#*T=(5+2q|Ekxf(PBYNVpiSv(xywYW`b)E}UPC80$ zl3}}S^f4>@r!+q1Ob2U0d9Oj}s-J7<`2)e(NyLLs^QhK+rdN4fzHqvh#u?jkjIy)L zTT1?Ka3(>{k1(9&uYit8>oqYtb0W^FM$v_>#)fN>PRP#$o8qN%zM8ooEv8R%19*JG zi^zYA(ocdjv_VYpInU@~C1QdRI;Y)kApQ#^H}+60&>Wd8&51#|Mq*{Oo&d|q$e|yS z>Z(+}_VW_o(pWOm52*vyr~B_rj?GdZn|datRnX&ziazngWHQs~ESg_R^V^Hsp14Gx zsokz?`KFY%O?45djCLg2_K2Km7tls`b1j;WHK%a`gI=QK%E&cp0=?A^cn#y@D|Id` z`VLu*NLoz_Jq*U1RO7-6`eFu0gY#NzPu{2Ch@brF)o)0hL@&^+)p%f+l{{$gnB z`a-v6Iu+9g8@$sA-T$5q2CQ@9(qkciYhpRGJ)+f7q{UFKjV5k*D;?yy< zf>KxmZQaPLu^1^9E^471sXMY@wm?;u|E;E|FDK98lGU_$ZkX}J_p?YmSA&{yhVOS5 zIRA%2+Y~F&a?+G>Rr>&Qw2~uUCq#*b8S*oT?oMk{1@@skZ5wM4NVdOtCau{ncFk_R z65_Bi`ORyVY-+V)BHKsP*F`*itr6DMZ-=$IZQhvZE68)xY9T3W9^|{QSf;eM)10O8 zjb>9SYvZnx& z&t`hyjgT93ZU=S-x^Z73bvT!FpQ?QYyQ^XFZ7DP?&39q&A4KXlgx2}ln26jbSoMilQvIRA^#`m|O8P2Kb`vL^O*ylg2R7MuFmHGRuv#BHe{#S7IC5`m zzTLS@KFk_RCtaKjN|rO2d26SX-MjhRhi>U&RL)~}7wgWIWS+v<8HyIVQ9#ahytTTgCY zw103rsY$ZX3%%`f@zDt%`QmtmwNPfPbDG_2-rC zpm{y7-`1W6nVff@ULNeublpoA{oXzWb1u&xQqLQ^liCe3m1H@;81=eU_^v9xg?}5{ zIHh9J&gW*%EW0k}-CeKSSX2&c32)b5%cbI>T*|_Kh_mFVlFlB?ZEE{rHZrnxH=xpqkmbx4d&=}0T+1(*6MOO=;pT0ygnN4b5F2V@NI4Bmb~p? zvV-;M@9mDY>6e}_+p{A4on1H5@Vi?Xy8zQYtQCLWnp^AM%-U=3Yi{Q`X?Jt}u$jw> zx$Q5u1g{y(2V88O34sOXiu6`XmP?h?VAk;ao%-lYGq>+|iz!%p?=J6tb<*DQzEc|y zO4W65PGIx;d1tB2y;K=H>9+puwUe%Gol<*i&udG&nR@DVo}cbJr0x8!1-SN}H$bZ! zCsQ9eGi%&0^p`-d*v}4eZFg(S{(QQCb>2wt$=CqDH@u~|>?7?rbGbq3xeaRtd}M9h zPI5Gac1U;SLh6$6ht&sqw7mNwdtUUg7IAR^xTLg+V_!d4Z>|HHEsd8>(mOOV6%TL+ zw3{Mu_q$^@cRCjG0M;UIP*?4%Kn1UP2oJAls_4KgrZw~~SN^zJ>J^I|KnAIxX$ zWU3>uReg)WJ|t^QafouTH_L88_KguY{5kO35@1fkc#}ao>j!I?n*psI`i#a1j!Q1W zP1^N4#Z4P{)hStf_jbCtlh%v;cU$q?TWdcc^Yae(GvMR&a|ilNkv{1bGGHHLwaYX47 z=AjMU*DFDPH`gDeHJu}k57@r*GXCM?#=uAA3Wq^jcZTQILX7=V{^8$M_S0Zb$Se4y za%yH}$^~l=WA9=A+6-V{>IuA*>7FI61JaeUzJ|G;!ase`SNfK5O{U00l3b&-gYAJI z9wZsrN4hQ%*{$#l&~t(EVLb0p7>=$Ffk$3@Hn;cX0*>7d@eIz-zHKC(+v@xKefHp% zicfYri+2Xh2BmD~9(9mrc6@*6C98+gzPA6EsUDomTFVXdULiZNXQ+!_qJEHseFb>2 zy#d{)#dvRndd?sp;?2PzUHOW86ou1rzmXQm{2wOQ^K#zj>pHsI!*3!N+S$tfdQ}d~ zh*No5U+;AEo^!pu-{(L-%WjNv7xsG4zdM3=`22w$hnZxEuR%xKD*IM``X2OShVNti zEsqtwKZeE#WbU>%TY9}r{iQOOfA>u?cMyzgjh` zP9Gm%=e^vrKe=8I-LaFMak{u`UXQ=Dh;7E`@Z0ns#1ZhjHs_Ry|8Pz(*iVZfABvae z^`-ADE+56Zu3cQqPAa^XJ)qBC*VE-U$KjxRblsFOqxByKn^BHSaGLko(YQ|FoNhp$ z&jGH-V(mfBy?lL&8xD_gjXcvHtIYEhIk_36FV>X4>Z3atbJ+AGofCdrfn0h(J8B-l z((7Da*7dakI>+a*jyV3H8;lL#dNqYNqIm+x0e(PQTW23Mn+Nc-x$hF$HwFC$Z1gqk zL+<8IT2Hrgxq@~XS*}9AqHRFC*2YG;m%gNHW|`X?<|E#_+XM>%_T_LU*0OzYFreQ>npiW9gKhFPUwz9qgSC5`NGR zWtj8zg5FP*J=o}q0^QS+`Bxd^#5KQOaNmvGFaDe3@U9t& zHxJv(@&^5RcBcw9c8C||<9m5u5b zsfT14?NiYwbeX^JcN-~ZcEM$@C&3*fyKwxJao-922Q@O+uwBA*U1`3iJ)G@v8K8qF zJAWP66DHYKsuACpKKA`o^*KFwVO-tlCbQ^V`eiojR(_hFqXR!^=B<}lxqH)VdY_vO3;`f-l$4-tE?qAMEdhtUPm zZvvhSF&b( z)R9VFy59j=c-tWBPyI4vY~riq?a@z;Fkox}ZLwab2Kv^;$O4*j)5VROr|kzQ1G{|> z$L_;#w}iep=!e7*h+jMda&m__?-T!TjmTrL#l-yB_)Eai807evz}U<^4NAoW@IAv1 z`lGE27S~|!a(C?{)BOq@N6+m+QuHC#g0Fq6nRFRKlR2~j zn7IyHI;S@np9q){%_QY*LV~C5$sLeU{02>i{^Ua@R8H zz|Yh_N%qC-oo3h1z`g`tByG~j&x3St#QTk~QAuBS2f7b&ITi1x6*33Ejj%nx1y5Cw z2N&q)KszWFXQ&Hu8R;A%^;>33<+8s4k7ySYJaT@xpMlQVtu6w*nteHBj(K0$aZUx^EGk{l*5`x6?#_jig_zOLzw5DEh=O-UW0(cy9^3MfFdz zPD1C!xXT*$k;NcQY{ogP3G7{s!+juUzTO9NA=R5bFME6bO`{8X&7u|Pi#ccJLf;nN zv$??js?r{N5B7{RbM}&4@zGxEAFA)TZ!x^K_`YCxRyI7VnsvQfYXW-2Q@ND#K-bvz zi!R9TaRKDR7-O9MP9qj>)a$B~9l=la>7!&zuxCKC)Q<`>klLkmF8QzxOZzrFdonyb z7*4QyY`5Wu46D%YoXMX8aoT41-)1argp_^^#aVw2{V=_Yh7i zPw)+{cM4=O*y>{eKZ(PZFvdR}g=odF4{EY5x}T@OhWt(a96lO+(Xlv^Y3fFq_Z099 zG6eRzq|}!fo5rqb?gRQ21 z%=9{5lD8XV`d}l$-chn@u=i{S`_ag-L#9nA&n z2e~$0H(wq(urIkCs&~NNpMg0%*@29~wFlXDdEj;dq4`n;1eWisB{`|IqNiCK?_?<)h4i~W*^ z`_BT$_|m#C>ZX+DSiVIdH#V4SGa%zkO=Dz3aVp8DqR2y|?1<#+i<4~9;t8^l(1W#a zc55|8d&lzw=9mxCNWof(Z>p{92pLB5L&&F1?av! zFCZk>BFDNtCYOnP@|>x6p!-hs`{M34+;;FJ$^BD&Ys7}X-bcp7i0)HgyP3)oeanvU z=S%Sx^cAV`2gPRrvJ7(~$HFdcIFA#d8q{ z(4Pl;cI4Q{*GrrG5j--zZzpI^g-7Uf!N1iQm7+Uk0=@LU8^Cbi@irI(>2-E%HvhRC zi<0KuL|wFnFulyTALy_r&0WrGBzp_m$P>WB%mqH7{-l~N6SgQj9q%-_D(Nilp?i6( zirID}a)9M98siR9+{PGhV19}({V5$&qL(AFOZE=vtfh~yukBvp5y{@nPSKAS`u+v* zhv$AIHZI#PUF_RR!yNRvpO7~e`X)LDQNpQ|e~&DW%4C8f}pp&_H|C zpJn%Gi}Wy$nfSKHW1yq2sH;>m!e@xSYqW>c)Ry7?7@)aAf#^4&%Z*WYLfwkRv=8We zB5Nb((1L6q%v^*Gc;fo+<(tCtUdqMm>Hdow*-jz6n>&Hm#^yC~_ZZi#pOR0<^^%x% zjG^B2e|AY})gRf->yKr=cKhqqT{4($KJj@hu&es^RXOZ6u( zexvOr-&(Y61f3XdO3*PI-tgu$zaX<2+bFxZ-RhtWr#|PS=XE3>8ro9HIN4oom5uYZ zX^b(>cALBD?0!(H&rh@Aa$C?5*YIqIv>~5Wani+07SmkxgEL|8%LT85`X8PV8isTC z0^e3CySUF^PlxFMFZVOBXG_o9yS$g}neZ;h9Eog2x%9ksVJ~rEKgIpkEfK#D&~lOF z^8ww=0LK7N%_BC`BsanHEQoXB?<4yAqg1V~{gTCFauw8pW7!e^$g;W?X!d zvxhiMr%e4VO@2w*Kkl=Qwv9g5Lt$6VA3qDx zm(PXG@O!kwufLLb^o>#1TskShWyg|XT3|oG!?EYij_YwQtd+H=XU{;Ewvr>#@3+Rm z3$VXWrL`mD2l*rDiv~F-(JaXYkk2_r(y&P%U_AJ~jCj9E{=J-cE3n6`gS?Grw9#h4 zc!jx&53~I2r!fa1b=SN^L#ut!3aBt)Ot=dgR z-J^9|CUR{tN68{ND)p{4CvvqU`yPO==^3?Km>1}iXv>cSJZt#5lWn3%|Ak35O=%8) zf$Xu*K7B`XYrQBuFyB1>7sOzV@pG|Wl^~XS^D#2_mFFbKjma5Tu)P2lK_i^LBt1{c3n2C+J>xC%X~#428+bc>{ySP`_Q|+)z&-2d z>7@7w%Y~z{1b&7S>4TqJ?lp4-%!vS7YZ}lthsQ{l#LpDOBQME$lYp+rQ{ErancjEI zJ|@0{y;SYE!d)a`f1kEH4FpgzbPQW!})%#AIu4 z10F5B$MZqK?;^=tYKLHO46%5*pDNfF=mV*FaeKPX>#F>gbQO!_v4mse68$ot?>_Lg zGI=M({U205?!xDfawj*z+>I~I#s}1W*j&G0EQ62z*vvh_zV7#Ll3;_v z*!jyD>?zrDiR24rJNw25J%^Ck<;}~lgS5A~16fend)aR1I+nNPdIf`w3;PW7br#Ui ztmV4oxqe7xGVvQ1#}`AiC5ZmP&LX1Cnx z1?wZb!t+>?-mneRFZ!$TY|J=A=%4rwlW{S!fIjG&jlm{ZAE5=1^NoD3TV8ZC*Uw7M zU@^O^KAn(ba+>advGx+?Vhn*7CBM6mXNt)gFOb)mi_q`5G}pUZUEb$WudkDHB%Ryw z#a*f3mrG^8oWB5EvVPL*afHqr$QSs&G0Sf6irEWoj+dwSyN=-S5a4j6N4yb#c9vJ)HVtQmasaMb^Z-%LRM%^PEoBfLG>$Y2js zTZW$rU9q;xeC~NJjp_V+q#ur+i9|clG#7GiImyq}M8vOQT#KB;arv3bh`7IW)~l3l zAMM+4X8O)_t|h!?ogV1PAeWcDq{w@c&mZu*1~P5z(4S|^eq3+us%Ifpo2Y(EWf9J+ z-{~)hB-SVXP5p$drVZvExtQ}O*T-Rb<3i@lczvAQsGKey*jdj}&un98ddCQ4$E9%& zQG2yR&QN$4=-21}j);Y;dq*L+>!Hrt%uzcnf6d~Gte#5A0{e;P^pbN2^s5QlxXZ0>jV)Sf0FaK z-xY1y!JhbRL2lMyEgJOP2#156FOJ{O_&QA&%>GnlBkYabZa)MvxiaWBr^*^d%7mhi z>&kLAIBo5?txNX|7N2%fC!P<;U|zEKq~=SVkV70>nggN7b0y($(EpWUCT^{u!=6lmU&}FT)$FOBc)^ZRg$la*@$erW%!}spA5_J7T8``b0lCJu||`L3^9T z*nE$skC zq6}gD2s-mZsvSjR*%s<}B>x-eYfo~V1dOONi5$$5_a5yjj%O0<5_=pu*Smmq+Bt{C z_8#VPKX;dQ8tZHTE}ECXa}LVD~-o!BOGr>^pz9lO!u8rU<4k)IA5yYJU)IPdroOf>G=d0 zrs^4#i2kr{TZ-97>D{U!RwPnh!zaE`vE%TwA8O4;#AIM?mQ z2wxEB-`f+~E&C_Xq@1^L3NCqV+Ed0Cdj{5?I;s6BvP1T(9ETTh4|>Z9?b!MM6W~O7 ze*&C9$EDrzcDH!eZ$0jxLZ5-Z;iR@eCwR^YY{295=ii+$e{M6J00YevKA}&(&z{mJ z>Y`6>slPj^U#$Of0v|XTjEU41r}T+=c<9R+%*Y;o0?foeaZ)?hfbga^h2D&SJ3Vh*_R%qz3FM~o>33-PZ~QtX7#ME=PZZF7>^VFfm;vl;f-16 zG3?W@uMn6s5qb`lC+0oATf;GuvEP$i*0?@MPBdBDqdJj!45sVFi~%|<=KZ+r{F-?j zkR6lgK0u%FV_*RL+MC6`zh!z@#QR|hWBYM6mjdngy>xpF&tv^9Jm zpR3;o-;K%L9QU*3)&?89o66#ucT!v8K7T!z;M%yi<78zYI9^=P zBs^b0au7)DM4g}PgUVe?IayA5O8v9<1eO}!Cjq=y7`0R0Lw#Q~*CUW@E+@tE@PO{x z!G0T+yLw=G4^sP=;}Ga&%X20~?rX8uZ%wOuj_awpdrtu0p61kNFJ2M~tgr1}yh|7cHn9cx;bi@QlL zQ@M0NW?-%*hn2?C@T_(%Mc`?o@2s$|wR(hhdQB0hiQ&I;y4Qj|u~ptZwCab4R`nSc z;G%kH%zB3ctXJQwbt;qEjXUYh>X*GvJ6S!{FCIFDL-oel*Pf>7>a3gsEpApTwc-2e zq2Frnj`A;?PdhyxSD)HxgN&tdzI<*0yuKi3-`F?zvl^)>*l&-=PI|PcWNHh5KUHJ* zN~q_XNSh7VHB(ws#yt$uDUa5ur{^X?_8#o8e_8M}eSbN%(dU_|FEAD|l-o=3b?Ls8 zLLct|m|+Z*)H0)ak}Rjxa2E}&h1jI|13XUbW@>m((t+Je^i*w?FJk1p<)p0}?6W>2 zH9ZYJN|9^+p52$T(c98F#pXAXxwJ4Q*9!9QMT|)E)4wF|W6;e3ebkZ!rgnD5VDm_B z)(qo063p}rx15VNAEZUyC1X9ocG|*NbjATapf|6wJAtat)x#M3AUq$=k&tQ)wn;ry zn!`!%6|$yna+g4HZpJs$Zwle>TAYu8wqx$i+OS;iy&5kPI_(zaFs%o(i0fzcNNOl! zO;ymdI`w0@gEQ#!m~Ub1&MY!^aQ{N|JR|GivKXVO<^lKbGr9lOuy*_E4P84WhqRd^ z`DLt*pj0QyGORPrmvc&t27?^U%3vzJYm*#G>3utNKM>fVbCx5GcM)MN172S@gSB$X zyzZ4&^OWY#F@7d-7?FFf!;WhekweR3(%OE6_?2=Gj+}`(6&Jz%PqYRo*|TK-K=`}? zu5+limax&sj$9wlTm#{I%{wF)dR^ETFn+VolDo#rheD=i(RXs*DD@MLi4BAG+p!*m z+X3B-n z?&W%Tt`Xk31-(|Tp2L;hHBirMOZ~Ot^U!+|+(Aw)f7ZAmdux*J(S{tkv4Bm5C3s#m z)|fHn9Ljz1Jv}^kDgQkRPBl)U@iFYNG(QXWf(5&$o08d(tIeAB?*{A-#(_&T;E=ByRjo zxkv?W`&|dQNX_Etc#gD8`;F7?ILo`jUhm&pQ?M~lJMUcx=E(L7Zo4VDy;7by=A7d> zemSQ8KHN_=5-+qSJk~0&;WJ*VI;!rvs~c-+s*Y!Y#= zk+lDu7z38zvR*#kvD!~kF3O?@^oaP08~|WIpT8IRKXv?`#~2t`9+hjl>nwa8obdsx zE47sN|AVGu?vyibr6SOGc1`lh(j;!=;~l-wN6Mk~#K$sis5!)yXnUH;BYp;p;YqJ~ zyy+LD@l$I2AV$A2oU1eNbC5fSGMMBD7|zKl=U$9w(qh&xB=3>GQ~WF;UDLXXvmDsx zIk(%`4oL0OnsVmw?lyeZ?4IeI7O8V+ak!73zc?-5J3O9ZJ7{O`G#Jdf%LzW9u${wg zBw7B&=B3MWXF5osAK-G1@m+4)1p9^LTPRrRKFM_)Z{3c&VEzfsP6r!mpJU@HGzq-n zC8-_XSUQ;^*0)^tXC9s@U^N#i9*I$5Er(JO=}*{3_zrlCjp`_2hPvLR~+06Ii`0XU%t$qB(-TU|HSg~yt-Scc=a~=(TZ*Ax0KG@wnJxQ+5XXp zvddU~1>-t}AQ? zc+YdAlzkYGv$VWlD+hh%oMd2Eo9eCe+WB|Ithi?!WYvb>#Rfe2Xs!b>#j|+#tj(KfPM^}R5MfY_k5jW%>8Ql90NH^%;*JP>W;v*XXQ{YW#3+o>0O6pf55YzUcYS#y%W#p%j*WRq(%8j zx=-cCgnxRD@P5W?m{MFwh38&$_h|!k1FS

!^_PrbK_X2>e!2=-5f1o1)Ak#X~!7p{$mD&V#Cz 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 string - :param name: + :param name: :type name: string :rtype: string :abstract: Yes @@ -247,12 +247,12 @@ AbstractClassReturner .. py:method:: giveMeAbstract() -> jsii-calc.AbstractClass - :rtype: :py:class:`~jsii-calc.AbstractClass`\ + :rtype: :py:class:`~jsii-calc.AbstractClass`\ .. py:method:: giveMeInterface() -> jsii-calc.InterfaceImplementedByAbstractClass - :rtype: :py:class:`~jsii-calc.InterfaceImplementedByAbstractClass`\ + :rtype: :py:class:`~jsii-calc.InterfaceImplementedByAbstractClass`\ .. py:attribute:: returnAbstractFromProperty @@ -291,11 +291,11 @@ Add - :extends: :py:class:`~jsii-calc.BinaryOperation`\ + :extends: :py:class:`~jsii-calc.BinaryOperation`\ :param lhs: Left-hand side operand - :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ :param rhs: Right-hand side operand - :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:method:: toString() -> string @@ -396,9 +396,9 @@ AllTypes .. py:method:: enumMethod(value) -> jsii-calc.StringEnum - :param value: - :type value: :py:class:`~jsii-calc.StringEnum`\ - :rtype: :py:class:`~jsii-calc.StringEnum`\ + :param value: + :type value: :py:class:`~jsii-calc.StringEnum`\ + :rtype: :py:class:`~jsii-calc.StringEnum`\ .. py:attribute:: enumPropertyValue @@ -438,7 +438,7 @@ AllTypes .. py:attribute:: enumProperty - :type: :py:class:`~jsii-calc.AllTypesEnum`\ + :type: :py:class:`~jsii-calc.AllTypesEnum`\ .. py:attribute:: jsonProperty @@ -448,7 +448,7 @@ AllTypes .. py:attribute:: mapProperty - :type: string => :py:class:`@scope/jsii-calc-lib.Number`\ + :type: string => :py:class:`@scope/jsii-calc-lib.Number`\ .. py:attribute:: numberProperty @@ -473,7 +473,7 @@ AllTypes .. py:attribute:: unionProperty - :type: string or number or :py:class:`~jsii-calc.Multiply`\ or :py:class:`@scope/jsii-calc-lib.Number`\ + :type: string or number or :py:class:`~jsii-calc.Multiply`\ or :py:class:`@scope/jsii-calc-lib.Number`\ .. py:attribute:: unknownArrayProperty @@ -560,9 +560,9 @@ AllowedMethodNames .. py:method:: getBar(_p1, _p2) - :param _p1: + :param _p1: :type _p1: string - :param _p2: + :param _p2: :type _p2: number @@ -572,18 +572,18 @@ AllowedMethodNames - :param withParam: + :param withParam: :type withParam: string :rtype: string .. py:method:: setBar(_x, _y, _z) - :param _x: + :param _x: :type _x: string - :param _y: + :param _y: :type _y: number - :param _z: + :param _z: :type _z: boolean @@ -593,9 +593,9 @@ AllowedMethodNames - :param _x: + :param _x: :type _x: string - :param _y: + :param _y: :type _y: number @@ -663,7 +663,7 @@ AsyncVirtualMethods .. py:method:: overrideMe(mult) -> number - :param mult: + :param mult: :type mult: number :rtype: number @@ -740,13 +740,13 @@ BinaryOperation - :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ - :implements: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ + :implements: :py:class:`@scope/jsii-calc-lib.IFriendly`\ :abstract: Yes :param lhs: Left-hand side operand - :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ :param rhs: Right-hand side operand - :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:method:: hello() -> string @@ -839,7 +839,7 @@ Calculator - :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ + :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ :param props: Initialization properties. :type props: :py:class:`~jsii-calc.CalculatorProps`\ *(optional)* @@ -849,7 +849,7 @@ Calculator - :param value: + :param value: :type value: number @@ -859,7 +859,7 @@ Calculator - :param value: + :param value: :type value: number @@ -877,7 +877,7 @@ Calculator - :param value: + :param value: :type value: number @@ -925,7 +925,7 @@ Calculator - :type: :py:class:`@scope/jsii-calc-lib.Value`\ + :type: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:attribute:: maxValue @@ -1006,7 +1006,7 @@ Calculator - :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ + :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ CalculatorProps (interface) @@ -1082,7 +1082,7 @@ ClassWithMutableObjectLiteralProperty .. py:attribute:: mutableObject - :type: :py:class:`~jsii-calc.MutableObjectLiteral`\ + :type: :py:class:`~jsii-calc.MutableObjectLiteral`\ ClassWithPrivateConstructorAndAutomaticProperties @@ -1116,15 +1116,15 @@ ClassWithPrivateConstructorAndAutomaticProperties - :implements: :py:class:`~jsii-calc.InterfaceWithProperties`\ + :implements: :py:class:`~jsii-calc.InterfaceWithProperties`\ .. py:staticmethod:: create(readOnlyString, readWriteString) -> jsii-calc.ClassWithPrivateConstructorAndAutomaticProperties - :param readOnlyString: + :param readOnlyString: :type readOnlyString: string - :param readWriteString: + :param readWriteString: :type readWriteString: string - :rtype: :py:class:`~jsii-calc.ClassWithPrivateConstructorAndAutomaticProperties`\ + :rtype: :py:class:`~jsii-calc.ClassWithPrivateConstructorAndAutomaticProperties`\ .. py:attribute:: readOnlyString @@ -1171,12 +1171,12 @@ Constructors .. py:staticmethod:: makeClass() -> jsii-calc.PublicClass - :rtype: :py:class:`~jsii-calc.PublicClass`\ + :rtype: :py:class:`~jsii-calc.PublicClass`\ .. py:staticmethod:: makeInterface() -> jsii-calc.IPublicInterface - :rtype: :py:class:`~jsii-calc.IPublicInterface`\ + :rtype: :py:class:`~jsii-calc.IPublicInterface`\ DefaultedConstructorArgument @@ -1206,11 +1206,11 @@ DefaultedConstructorArgument - :param arg1: + :param arg1: :type arg1: number *(optional)* - :param arg2: + :param arg2: :type arg2: string *(optional)* - :param arg3: + :param arg3: :type arg3: date *(optional)* .. py:attribute:: arg1 @@ -1293,7 +1293,7 @@ Derived - :extends: :py:class:`~jsii-calc.DerivedClassHasNoProperties.Base`\ + :extends: :py:class:`~jsii-calc.DerivedClassHasNoProperties.Base`\ .. py:attribute:: prop @@ -1336,7 +1336,7 @@ DerivedStruct (interface) - :extends: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ + :extends: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ .. py:attribute:: anotherRequired @@ -1355,7 +1355,7 @@ DerivedStruct (interface) - :type: :py:class:`~jsii-calc.DoubleTrouble`\ + :type: :py:class:`~jsii-calc.DoubleTrouble`\ .. py:attribute:: anotherOptional @@ -1436,7 +1436,7 @@ DoNotOverridePrivates .. py:method:: changePrivatePropertyValue(newValue) - :param newValue: + :param newValue: :type newValue: string @@ -1484,11 +1484,11 @@ DoNotRecognizeAnyAsOptional .. py:method:: method(_requiredAny, [_optionalAny, [_optionalString]]) - :param _requiredAny: + :param _requiredAny: :type _requiredAny: any - :param _optionalAny: + :param _optionalAny: :type _optionalAny: any *(optional)* - :param _optionalString: + :param _optionalString: :type _optionalString: string *(optional)* @@ -1522,9 +1522,9 @@ DontComplainAboutVariadicAfterOptional .. py:method:: optionalAndVariadic(optional, *things) -> string - :param optional: + :param optional: :type optional: string *(optional)* - :param \*things: + :param \*things: :type \*things: string :rtype: string @@ -1556,7 +1556,7 @@ DoubleTrouble - :implements: :py:class:`~jsii-calc.IFriendlyRandomGenerator`\ + :implements: :py:class:`~jsii-calc.IFriendlyRandomGenerator`\ .. py:method:: hello() -> string @@ -1607,7 +1607,7 @@ ExportedBaseClass - :param success: + :param success: :type success: boolean .. py:attribute:: success @@ -1649,9 +1649,9 @@ GiveMeStructs - :param derived: - :type derived: :py:class:`~jsii-calc.DerivedStruct`\ - :rtype: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ + :param derived: + :type derived: :py:class:`~jsii-calc.DerivedStruct`\ + :rtype: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ .. py:method:: readDerivedNonPrimitive(derived) -> jsii-calc.DoubleTrouble @@ -1660,9 +1660,9 @@ GiveMeStructs - :param derived: - :type derived: :py:class:`~jsii-calc.DerivedStruct`\ - :rtype: :py:class:`~jsii-calc.DoubleTrouble`\ + :param derived: + :type derived: :py:class:`~jsii-calc.DerivedStruct`\ + :rtype: :py:class:`~jsii-calc.DoubleTrouble`\ .. py:method:: readFirstNumber(first) -> number @@ -1671,8 +1671,8 @@ GiveMeStructs - :param first: - :type first: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ + :param first: + :type first: :py:class:`@scope/jsii-calc-lib.MyFirstStruct`\ :rtype: number @@ -1711,8 +1711,8 @@ GreetingAugmenter .. py:method:: betterGreeting(friendly) -> string - :param friendly: - :type friendly: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :param friendly: + :type friendly: :py:class:`@scope/jsii-calc-lib.IFriendly`\ :rtype: string @@ -1747,7 +1747,7 @@ IFriendlier (interface) - :extends: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :extends: :py:class:`@scope/jsii-calc-lib.IFriendly`\ .. py:method:: farewell() -> string @@ -1810,8 +1810,8 @@ IFriendlyRandomGenerator (interface) - :extends: :py:class:`~jsii-calc.IRandomNumberGenerator`\ - :extends: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :extends: :py:class:`~jsii-calc.IRandomNumberGenerator`\ + :extends: :py:class:`@scope/jsii-calc-lib.IFriendly`\ .. py:method:: hello() -> string @@ -1872,7 +1872,7 @@ IInterfaceThatShouldNotBeADataType (interface) - :extends: :py:class:`~jsii-calc.IInterfaceWithMethods`\ + :extends: :py:class:`~jsii-calc.IInterfaceWithMethods`\ .. py:attribute:: otherValue @@ -1970,9 +1970,9 @@ IInterfaceWithOptionalMethodArguments (interface) .. py:method:: hello(arg1, [arg2]) - :param arg1: + :param arg1: :type arg1: string - :param arg2: + :param arg2: :type arg2: number *(optional)* :abstract: Yes @@ -2125,7 +2125,7 @@ IReturnsNumber (interface) .. py:method:: obtainNumber() -> @scope/jsii-calc-lib.IDoublable - :rtype: :py:class:`@scope/jsii-calc-lib.IDoublable`\ + :rtype: :py:class:`@scope/jsii-calc-lib.IDoublable`\ :abstract: Yes @@ -2156,7 +2156,7 @@ ImplictBaseOfBase (interface) - :extends: :py:class:`@scope/jsii-calc-base.BaseProps`\ + :extends: :py:class:`@scope/jsii-calc-base.BaseProps`\ .. py:attribute:: goo @@ -2168,7 +2168,7 @@ ImplictBaseOfBase (interface) *Inherited from* :py:attr:`@scope/jsii-calc-base-of-base.VeryBaseProps <@scope/jsii-calc-base-of-base.VeryBaseProps.foo>` - :type: :py:class:`@scope/jsii-calc-base-of-base.Very`\ + :type: :py:class:`@scope/jsii-calc-base-of-base.Very`\ .. py:attribute:: bar @@ -2205,7 +2205,7 @@ InbetweenClass - :extends: :py:class:`~jsii-calc.PublicClass`\ + :extends: :py:class:`~jsii-calc.PublicClass`\ .. py:method:: hello() @@ -2436,7 +2436,7 @@ InterfaceWithPropertiesExtension (interface) - :extends: :py:class:`~jsii-calc.InterfaceWithProperties`\ + :extends: :py:class:`~jsii-calc.InterfaceWithProperties`\ .. py:attribute:: foo @@ -2488,12 +2488,12 @@ JSObjectLiteralForInterface .. py:method:: giveMeFriendly() -> @scope/jsii-calc-lib.IFriendly - :rtype: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :rtype: :py:class:`@scope/jsii-calc-lib.IFriendly`\ .. py:method:: giveMeFriendlyGenerator() -> jsii-calc.IFriendlyRandomGenerator - :rtype: :py:class:`~jsii-calc.IFriendlyRandomGenerator`\ + :rtype: :py:class:`~jsii-calc.IFriendlyRandomGenerator`\ JSObjectLiteralToNative @@ -2526,7 +2526,7 @@ JSObjectLiteralToNative .. py:method:: returnLiteral() -> jsii-calc.JSObjectLiteralToNativeClass - :rtype: :py:class:`~jsii-calc.JSObjectLiteralToNativeClass`\ + :rtype: :py:class:`~jsii-calc.JSObjectLiteralToNativeClass`\ JSObjectLiteralToNativeClass @@ -2908,7 +2908,7 @@ LoadBalancedFargateServiceProps (interface) 4096 (4 vCPU) - Available memory values: Between 8GB and 30GB in 1GB increments - + This default is set in the underlying FargateTaskDefinition construct. @@ -2922,33 +2922,33 @@ LoadBalancedFargateServiceProps (interface) The amount (in MiB) of memory used by the task. - + This field is required and you must use one of the following values, which determines your range of valid values for the cpu parameter: - + 0.5GB, 1GB, 2GB - Available cpu values: 256 (.25 vCPU) - + 1GB, 2GB, 3GB, 4GB - Available cpu values: 512 (.5 vCPU) - + 2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB - Available cpu values: 1024 (1 vCPU) - + Between 4GB and 16GB in 1GB increments - Available cpu values: 2048 (2 vCPU) - + Between 8GB and 30GB in 1GB increments - Available cpu values: 4096 (4 vCPU) - + This default is set in the underlying FargateTaskDefinition construct. @@ -3009,13 +3009,13 @@ Multiply - :extends: :py:class:`~jsii-calc.BinaryOperation`\ - :implements: :py:class:`~jsii-calc.IFriendlier`\ - :implements: :py:class:`~jsii-calc.IRandomNumberGenerator`\ + :extends: :py:class:`~jsii-calc.BinaryOperation`\ + :implements: :py:class:`~jsii-calc.IFriendlier`\ + :implements: :py:class:`~jsii-calc.IRandomNumberGenerator`\ :param lhs: Left-hand side operand - :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type lhs: :py:class:`@scope/jsii-calc-lib.Value`\ :param rhs: Right-hand side operand - :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ + :type rhs: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:method:: farewell() -> string @@ -3178,10 +3178,10 @@ Negate - :extends: :py:class:`~jsii-calc.UnaryOperation`\ - :implements: :py:class:`~jsii-calc.IFriendlier`\ - :param operand: - :type operand: :py:class:`@scope/jsii-calc-lib.Value`\ + :extends: :py:class:`~jsii-calc.UnaryOperation`\ + :implements: :py:class:`~jsii-calc.IFriendlier`\ + :param operand: + :type operand: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:method:: farewell() -> string @@ -3355,21 +3355,21 @@ NullShouldBeTreatedAsUndefined - :param _param1: + :param _param1: :type _param1: string - :param optional: + :param optional: :type optional: any *(optional)* .. py:method:: giveMeUndefined([value]) - :param value: + :param value: :type value: any *(optional)* .. py:method:: giveMeUndefinedInsideAnObject(input) - :param input: - :type input: :py:class:`~jsii-calc.NullShouldBeTreatedAsUndefinedData`\ + :param input: + :type input: :py:class:`~jsii-calc.NullShouldBeTreatedAsUndefinedData`\ .. py:method:: verifyPropertyIsUndefined() @@ -3453,13 +3453,13 @@ NumberGenerator - :param generator: - :type generator: :py:class:`~jsii-calc.IRandomNumberGenerator`\ + :param generator: + :type generator: :py:class:`~jsii-calc.IRandomNumberGenerator`\ .. py:method:: isSameGenerator(gen) -> boolean - :param gen: - :type gen: :py:class:`~jsii-calc.IRandomNumberGenerator`\ + :param gen: + :type gen: :py:class:`~jsii-calc.IRandomNumberGenerator`\ :rtype: boolean @@ -3470,7 +3470,7 @@ NumberGenerator .. py:attribute:: generator - :type: :py:class:`~jsii-calc.IRandomNumberGenerator`\ + :type: :py:class:`~jsii-calc.IRandomNumberGenerator`\ ObjectRefsInCollections @@ -3511,7 +3511,7 @@ ObjectRefsInCollections - :param values: + :param values: :type values: :py:class:`@scope/jsii-calc-lib.Value`\ [] :rtype: number @@ -3522,8 +3522,8 @@ ObjectRefsInCollections - :param values: - :type values: string => :py:class:`@scope/jsii-calc-lib.Value`\ + :param values: + :type values: string => :py:class:`@scope/jsii-calc-lib.Value`\ :rtype: number @@ -3554,11 +3554,11 @@ OptionalConstructorArgument - :param arg1: + :param arg1: :type arg1: number - :param arg2: + :param arg2: :type arg2: string - :param arg3: + :param arg3: :type arg3: date *(optional)* .. py:attribute:: arg1 @@ -3606,8 +3606,8 @@ OverrideReturnsObject .. py:method:: test(obj) -> number - :param obj: - :type obj: :py:class:`~jsii-calc.IReturnsNumber`\ + :param obj: + :type obj: :py:class:`~jsii-calc.IReturnsNumber`\ :rtype: number @@ -3641,8 +3641,8 @@ Polymorphism .. py:method:: sayHello(friendly) -> string - :param friendly: - :type friendly: :py:class:`@scope/jsii-calc-lib.IFriendly`\ + :param friendly: + :type friendly: :py:class:`@scope/jsii-calc-lib.IFriendly`\ :rtype: string @@ -3677,11 +3677,11 @@ Power - :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ + :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ :param base: The base of the power - :type base: :py:class:`@scope/jsii-calc-lib.Value`\ + :type base: :py:class:`@scope/jsii-calc-lib.Value`\ :param pow: The number of times to multiply - :type pow: :py:class:`@scope/jsii-calc-lib.Value`\ + :type pow: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:attribute:: base @@ -3774,7 +3774,7 @@ Power - :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ + :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ PublicClass @@ -3809,6 +3809,162 @@ PublicClass +PythonReservedWords +^^^^^^^^^^^^^^^^^^^ + +.. py:class:: PythonReservedWords() + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.PythonReservedWords; + + .. code-tab:: javascript + + const { PythonReservedWords } = require('jsii-calc'); + + .. code-tab:: typescript + + import { PythonReservedWords } from 'jsii-calc'; + + + + + .. py:method:: and() + + + + .. py:method:: as() + + + + .. py:method:: assert() + + + + .. py:method:: async() + + + + .. py:method:: await() + + + + .. py:method:: break() + + + + .. py:method:: class() + + + + .. py:method:: continue() + + + + .. py:method:: def() + + + + .. py:method:: del() + + + + .. py:method:: elif() + + + + .. py:method:: else() + + + + .. py:method:: except() + + + + .. py:method:: finally() + + + + .. py:method:: for() + + + + .. py:method:: from() + + + + .. py:method:: global() + + + + .. py:method:: if() + + + + .. py:method:: import() + + + + .. py:method:: in() + + + + .. py:method:: is() + + + + .. py:method:: lambda() + + + + .. py:method:: nonlocal() + + + + .. py:method:: not() + + + + .. py:method:: or() + + + + .. py:method:: pass() + + + + .. py:method:: raise() + + + + .. py:method:: return() + + + + .. py:method:: try() + + + + .. py:method:: while() + + + + .. py:method:: with() + + + + .. py:method:: yield() + + + ReferenceEnumFromScopedPackage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3848,8 +4004,8 @@ ReferenceEnumFromScopedPackage .. py:method:: saveFoo(value) - :param value: - :type value: :py:class:`@scope/jsii-calc-lib.EnumFromScopedModule`\ + :param value: + :type value: :py:class:`@scope/jsii-calc-lib.EnumFromScopedModule`\ .. py:attribute:: foo @@ -3926,17 +4082,17 @@ RuntimeTypeChecking .. py:method:: methodWithDefaultedArguments([arg1, [arg2, [arg3]]]) - :param arg1: + :param arg1: :type arg1: number *(optional)* - :param arg2: + :param arg2: :type arg2: string *(optional)* - :param arg3: + :param arg3: :type arg3: date *(optional)* .. py:method:: methodWithOptionalAnyArgument([arg]) - :param arg: + :param arg: :type arg: any *(optional)* @@ -3946,11 +4102,11 @@ RuntimeTypeChecking - :param arg1: + :param arg1: :type arg1: number - :param arg2: + :param arg2: :type arg2: string - :param arg3: + :param arg3: :type arg3: date *(optional)* @@ -3981,7 +4137,7 @@ Statics - :param value: + :param value: :type value: string .. py:staticmethod:: staticMethod(name) -> string @@ -4118,7 +4274,7 @@ Sum - :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ + :extends: :py:class:`~jsii-calc.composition.CompositeOperation`\ .. py:attribute:: expression @@ -4202,7 +4358,7 @@ Sum - :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ + :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ SyncVirtualMethods @@ -4245,13 +4401,13 @@ SyncVirtualMethods .. py:method:: modifyOtherProperty(value) - :param value: + :param value: :type value: string .. py:method:: modifyValueOfTheProperty(value) - :param value: + :param value: :type value: string @@ -4277,14 +4433,14 @@ SyncVirtualMethods .. py:method:: virtualMethod(n) -> number - :param n: + :param n: :type n: number :rtype: number .. py:method:: writeA(value) - :param value: + :param value: :type value: number @@ -4381,10 +4537,10 @@ UnaryOperation - :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ + :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ :abstract: Yes - :param operand: - :type operand: :py:class:`@scope/jsii-calc-lib.Value`\ + :param operand: + :type operand: :py:class:`@scope/jsii-calc-lib.Value`\ .. py:attribute:: operand @@ -4528,7 +4684,7 @@ UseCalcBase .. py:method:: hello() -> @scope/jsii-calc-base.Base - :rtype: :py:class:`@scope/jsii-calc-base.Base`\ + :rtype: :py:class:`@scope/jsii-calc-base.Base`\ UsesInterfaceWithProperties @@ -4558,8 +4714,8 @@ UsesInterfaceWithProperties - :param obj: - :type obj: :py:class:`~jsii-calc.InterfaceWithProperties`\ + :param obj: + :type obj: :py:class:`~jsii-calc.InterfaceWithProperties`\ .. py:method:: justRead() -> string @@ -4568,14 +4724,14 @@ UsesInterfaceWithProperties .. py:method:: readStringAndNumber(ext) -> string - :param ext: - :type ext: :py:class:`~jsii-calc.InterfaceWithPropertiesExtension`\ + :param ext: + :type ext: :py:class:`~jsii-calc.InterfaceWithPropertiesExtension`\ :rtype: string .. py:method:: writeAndRead(value) -> string - :param value: + :param value: :type value: string :rtype: string @@ -4654,35 +4810,35 @@ VirtualMethodPlayground .. py:method:: overrideMeAsync(index) -> number - :param index: + :param index: :type index: number :rtype: number .. py:method:: overrideMeSync(index) -> number - :param index: + :param index: :type index: number :rtype: number .. py:method:: parallelSumAsync(count) -> number - :param count: + :param count: :type count: number :rtype: number .. py:method:: serialSumAsync(count) -> number - :param count: + :param count: :type count: number :rtype: number .. py:method:: sumSync(count) -> number - :param count: + :param count: :type count: number :rtype: number @@ -4723,7 +4879,7 @@ CompositeOperation - :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ + :extends: :py:class:`@scope/jsii-calc-lib.Operation`\ :abstract: Yes .. py:method:: toString() -> string @@ -4783,7 +4939,7 @@ CompositeOperation - :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ + :type: :py:class:`~jsii-calc.composition.CompositeOperation.CompositionStringStyle`\ .. py:class:: CompositionStringStyle @@ -4837,3 +4993,4 @@ CompositeOperation .. py:currentmodule:: jsii-calc + diff --git a/packages/jsii-reflect/test/classes.expected.txt b/packages/jsii-reflect/test/classes.expected.txt index d01911cfa7..4723146f5c 100644 --- a/packages/jsii-reflect/test/classes.expected.txt +++ b/packages/jsii-reflect/test/classes.expected.txt @@ -42,8 +42,8 @@ OptionalConstructorArgument OverrideReturnsObject Polymorphism Power -PythonReservedWords PublicClass +PythonReservedWords ReferenceEnumFromScopedPackage ReturnsPrivateImplementationOfInterface RuntimeTypeChecking @@ -58,4 +58,4 @@ UsesInterfaceWithProperties Value VariadicMethod Very -VirtualMethodPlayground +VirtualMethodPlayground \ No newline at end of file diff --git a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt index 8271e1c625..51c230e60e 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt @@ -691,6 +691,12 @@ assemblies │ │ └─┬ pow property │ │ ├── immutable │ │ └── type: class:@scope/jsii-calc-lib.Value + │ ├─┬ class PublicClass + │ │ └─┬ members + │ │ ├─┬ () method + │ │ │ └── returns: void + │ │ └─┬ hello() method + │ │ └── returns: void │ ├─┬ class PythonReservedWords │ │ └─┬ members │ │ ├─┬ () method @@ -758,11 +764,6 @@ assemblies │ │ ├─┬ with() method │ │ │ └── returns: void │ │ └─┬ yield() method - │ ├─┬ class PublicClass - │ │ └─┬ members - │ │ ├─┬ () method - │ │ │ └── returns: void - │ │ └─┬ hello() method │ │ └── returns: void │ ├─┬ class ReferenceEnumFromScopedPackage │ │ └─┬ members diff --git a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt index 46a383626b..f65536e262 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt @@ -56,8 +56,8 @@ assemblies │ ├── class Polymorphism │ ├─┬ class Power │ │ └── base: CompositeOperation - │ ├── class PythonReservedWords │ ├── class PublicClass + │ ├── class PythonReservedWords │ ├── class ReferenceEnumFromScopedPackage │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking diff --git a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt index ddf86efcac..2dc70c18fc 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt @@ -289,6 +289,10 @@ assemblies │ │ ├── base property │ │ ├── expression property │ │ └── pow property + │ ├─┬ class PublicClass + │ │ └─┬ members + │ │ ├── () method + │ │ └── hello() method │ ├─┬ class PythonReservedWords │ │ └─┬ members │ │ ├── () method @@ -324,10 +328,6 @@ assemblies │ │ ├── while() method │ │ ├── with() method │ │ └── yield() method - │ ├─┬ class PublicClass - │ │ └─┬ members - │ │ ├── () method - │ │ └── hello() method │ ├─┬ class ReferenceEnumFromScopedPackage │ │ └─┬ members │ │ ├── () method diff --git a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt index 77adc9c2d0..674648f02a 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt @@ -41,8 +41,8 @@ assemblies │ ├── class OverrideReturnsObject │ ├── class Polymorphism │ ├── class Power - │ ├── class PythonReservedWords │ ├── class PublicClass + │ ├── class PythonReservedWords │ ├── class ReferenceEnumFromScopedPackage │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking From cc0b2742e6424caa61c4e9089a64538adcef118b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 15:32:46 -0500 Subject: [PATCH 092/117] Slight reworking to remove cyclic import --- packages/jsii-python-runtime/src/jsii/__init__.py | 12 +++--------- packages/jsii-python-runtime/src/jsii/__meta__.py | 12 ++++++++++++ .../src/jsii/_kernel/providers/process.py | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 packages/jsii-python-runtime/src/jsii/__meta__.py diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 112411c1eb..ea769e4d08 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -1,8 +1,6 @@ -import json - from typing import Union -from jsii._compat import importlib_resources +from .__meta__ import __version__, __jsii_runtime_version__ from ._runtime import ( JSIIAssembly, JSIIMeta, @@ -31,14 +29,10 @@ sinvoke = kernel.sinvoke stats = kernel.stats -# Load our version number and other metadata. -_meta = json.loads(importlib_resources.read_text("jsii", "_metadata.json")) - -__version__ = _meta["version"] -__jsii_runtime_version__ = _meta["jsii-runtime"]["version"] - __all__ = [ + "__version__", + "__jsii_runtime_version__", "JSIIAssembly", "JSIIMeta", "JSIIAbstractClass", diff --git a/packages/jsii-python-runtime/src/jsii/__meta__.py b/packages/jsii-python-runtime/src/jsii/__meta__.py new file mode 100644 index 0000000000..38023f04e4 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/__meta__.py @@ -0,0 +1,12 @@ +import json + +from jsii._compat import importlib_resources + +# Load our version number and other metadata. +_meta = json.loads(importlib_resources.read_text("jsii", "_metadata.json")) + +__version__ = _meta["version"] +__jsii_runtime_version__ = _meta["jsii-runtime"]["version"] + + +__all__ = ["__version__", "__jsii_runtime_version__"] diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 15ee1f2968..814dc882dd 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -12,7 +12,7 @@ import jsii._embedded.jsii -from jsii import __jsii_runtime_version__ +from jsii.__about__ import __jsii_runtime_version__ from jsii._compat import importlib_resources from jsii._utils import memoized_property from jsii._kernel.providers.base import BaseKernel From 26a838dcba43dfc2da7367db5acb1cfc053ba83c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 15:44:12 -0500 Subject: [PATCH 093/117] Use the correct name --- .../jsii-python-runtime/src/jsii/_kernel/providers/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 814dc882dd..c8718b8012 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -12,7 +12,7 @@ import jsii._embedded.jsii -from jsii.__about__ import __jsii_runtime_version__ +from jsii.__meta__ import __jsii_runtime_version__ from jsii._compat import importlib_resources from jsii._utils import memoized_property from jsii._kernel.providers.base import BaseKernel From 594831f9ec27a73ca632b15363bf26ffd4902c7a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 17:59:45 -0500 Subject: [PATCH 094/117] Implement round tripping datetimes --- packages/jsii-python-runtime/setup.py | 1 + .../src/jsii/_kernel/providers/process.py | 8 +++++++ .../tests/test_compliance.py | 22 ++++++++----------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/jsii-python-runtime/setup.py b/packages/jsii-python-runtime/setup.py index d3d7396128..f5d6406fb8 100644 --- a/packages/jsii-python-runtime/setup.py +++ b/packages/jsii-python-runtime/setup.py @@ -19,6 +19,7 @@ "attrs", "cattrs", "importlib_resources ; python_version < '3.7'", + "python-dateutil", "typing_extensions>=3.6.4", "mypy_extensions>=0.4.0", ], diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index c8718b8012..a77b103dd8 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -1,3 +1,4 @@ +import datetime import contextlib import importlib.machinery import json @@ -9,6 +10,7 @@ import attr import cattr # type: ignore +import dateutil.parser import jsii._embedded.jsii @@ -94,12 +96,18 @@ def _unstructure_ref(value): def ohook(d): if d.keys() == {"$jsii.byref"}: return ObjRef(ref=d["$jsii.byref"]) + if d.keys() == {"$jsii.date"}: + return dateutil.parser.isoparse(d["$jsii.date"]) return d def jdefault(obj): if hasattr(obj, "__jsii_ref__"): return _unstructure_ref(obj.__jsii_ref__) + if isinstance(obj, datetime.datetime) and obj.tzinfo is not None: + return {"$jsii.date": obj.isoformat()} + elif isinstance(obj, datetime.datetime): + raise TypeError("Naive datetimes are not supported, please add a timzone.") raise TypeError diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index 32fc0b9f5f..bf139bca04 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -1,6 +1,6 @@ import platform -from datetime import datetime +from datetime import datetime, timezone import pytest @@ -47,7 +47,6 @@ # Tests as closely as possible to make keeping them in sync easier. # These map distinct reasons for failures, so we an easily find them. -xfail_datetime = pytest.mark.xfail(reason="Datetime Not Implemented", strict=True) xfail_objref_array = pytest.mark.xfail( reason="ObjRef -> Concrete Instance in Array Not Implemented", strict=True ) @@ -187,7 +186,6 @@ def __init__(self, value): super().__init__(Number(value), Number(10)) -@xfail_datetime def test_primitiveTypes(): types = AllTypes() @@ -204,25 +202,24 @@ def test_primitiveTypes(): assert types.number_property == 1234 # date - types.date_property = datetime.fromtimestamp(123 / 1000.0) - assert types.date_property == datetime.fromtimestamp(123 / 1000.0) + types.date_property = datetime.fromtimestamp(123 / 1000.0, tz=timezone.utc) + assert types.date_property == datetime.fromtimestamp(123 / 1000.0, tz=timezone.utc) # json types.json_property = {"Foo": 123} assert types.json_property.get("Foo") == 123 -@xfail_datetime def test_dates(): types = AllTypes() # strong type - types.date_property = datetime.fromtimestamp(123 / 1000.0) - assert types.date_property == datetime.fromtimestamp(123 / 1000.0) + types.date_property = datetime.fromtimestamp(123 / 1000.0, tz=timezone.utc) + assert types.date_property == datetime.fromtimestamp(123 / 1000.0, tz=timezone.utc) # weak type - types.any_property(datetime.fromtimestamp(999 / 1000.0)) - assert types.any_property == datetime.fromtimestamp(999 / 1000.0) + types.any_property = datetime.fromtimestamp(999 / 1000.0, tz=timezone.utc) + assert types.any_property == datetime.fromtimestamp(999 / 1000.0, tz=timezone.utc) def test_collectionTypes(): @@ -239,7 +236,6 @@ def test_collectionTypes(): # TODO: No Assertion? -@xfail_datetime def test_dynamicTypes(): types = AllTypes() @@ -256,8 +252,8 @@ def test_dynamicTypes(): assert types.any_property == 12 # date - types.any_property = datetime.fromtimestamp(1234 / 1000.0) - assert types.any_property == datetime.fromtimestamp(1234 / 1000.0) + types.any_property = datetime.fromtimestamp(1234 / 1000.0, tz=timezone.utc) + assert types.any_property == datetime.fromtimestamp(1234 / 1000.0, tz=timezone.utc) # json (notice that when deserialized, it is deserialized as a map). types.any_property = {"Goo": ["Hello", {"World": 123}]} From b7b11a31805506d9b9cb04ab27ed467c1f79cfe2 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 18:51:14 -0500 Subject: [PATCH 095/117] Properly recurse into lists as well as dicts --- packages/jsii-python-runtime/src/jsii/_kernel/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index d11cf3eaf9..089844545d 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -2,7 +2,6 @@ from typing import Any, List, Optional, Type -import collections.abc import functools import attr @@ -60,8 +59,10 @@ def _get_overides(klass: JSClass, obj: Any) -> List[Override]: def _recursize_dereference(kernel, d): - if isinstance(d, collections.abc.Mapping): + if isinstance(d, dict): return {k: _recursize_dereference(kernel, v) for k, v in d.items()} + elif isinstance(d, list): + return [_recursize_dereference(kernel, i) for i in d] elif isinstance(d, ObjRef): return _reference_map.resolve_reference(kernel, d) else: From ddadab31ba8e623a2a8c424cfa6afc4d638d458f Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 18:51:37 -0500 Subject: [PATCH 096/117] Hold onto references ~forever --- packages/jsii-python-runtime/src/jsii/_reference_map.py | 7 +++++-- packages/jsii-python-runtime/src/jsii/_runtime.py | 7 ------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index 2d594d0855..827577afc1 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -1,6 +1,5 @@ # This module exists to break an import cycle between jsii.runtime and jsii.kernel import inspect -import weakref from typing import Any, MutableMapping @@ -26,7 +25,11 @@ def __init__(self, ref: str) -> None: class _ReferenceMap: def __init__(self, types): - self._refs = weakref.WeakValueDictionary() + # We are using a real dictionary here instead of a WeakValueDictionary because + # the nature of the JSII is such that we can never free the memory of JSII + # objects ever, because we have no idea how many references exist on the *other* + # side. + self._refs = {} self._types = types def register(self, inst: Referenceable): diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 96ec90a698..f3d5307cdd 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -69,13 +69,6 @@ def __call__(cls, *args, **kwargs): # Register this instance with our reference map. _reference_map.register_reference(inst) - # Whenever the object we're creating gets garbage collected, then we want to - # delete it from the JS runtime as well. - # TODO: Figure out if this is *really* true, what happens if something goes - # out of scope at the Python level, but something is holding onto it - # at the JS level? What mechanics are in place for this if any? - weakref.finalize(inst, kernel.delete, inst.__jsii_ref__) - return inst From 38a978620183900fec71ad673c466383f99b2d64 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 18:51:51 -0500 Subject: [PATCH 097/117] Remove xfails for recursive arrays --- packages/jsii-python-runtime/tests/test_compliance.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index bf139bca04..bcedb26663 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -47,9 +47,6 @@ # Tests as closely as possible to make keeping them in sync easier. # These map distinct reasons for failures, so we an easily find them. -xfail_objref_array = pytest.mark.xfail( - reason="ObjRef -> Concrete Instance in Array Not Implemented", strict=True -) xfail_enums = pytest.mark.xfail( reason="Implement (de)serialization of enums", strict=True ) @@ -287,7 +284,6 @@ def test_dynamicTypes(): assert types.any_property.value == 200 -@xfail_objref_array def test_unionTypes(): types = AllTypes() @@ -393,7 +389,6 @@ def test_undefinedAndNull(): calc.max_value = None -@xfail_objref_array def test_arrays(): sum_ = Sum() sum_.parts = [Number(5), Number(10), Multiply(Number(2), Number(3))] @@ -404,7 +399,6 @@ def test_arrays(): assert sum_.to_string() == "(((0 + 5) + 10) + (2 * 3))" -@xfail_objref_array def test_maps(): calc2 = Calculator() # Initializer overload (props is optional) calc2.add(10) From 0c7e22388b5909d409700e2ce9e1269d610bc001 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 19:12:46 -0500 Subject: [PATCH 098/117] Fix the naming of constant properties --- packages/jsii-pacmak/lib/targets/python.ts | 14 +++++++++----- .../jsii-python-runtime/tests/test_compliance.py | 4 ---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 27be397b90..49233c6de9 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -76,8 +76,12 @@ const toPythonMethodName = (name: string): string => { return toPythonIdentifier(toSnakeCase(name)); }; -const toPythonPropertyName = (name: string): string => { - return toPythonIdentifier(toSnakeCase(name)); +const toPythonPropertyName = (name: string, constant: boolean = false): string => { + let value = toPythonIdentifier(toSnakeCase(name)); + if (constant) { + value = value.toUpperCase(); + } + return value; }; const setDifference = (setA: Set, setB: Set): Set => { @@ -1325,7 +1329,7 @@ class PythonGenerator extends Generator { protected onStaticProperty(cls: spec.ClassType, prop: spec.Property) { this.getPythonType(cls.fqn).addMember( new StaticProperty( - toPythonPropertyName(prop.name), + toPythonPropertyName(prop.name, prop.const), prop.name, prop.type, { abstract: prop.abstract, immutable: prop.immutable }, @@ -1350,7 +1354,7 @@ class PythonGenerator extends Generator { protected onProperty(cls: spec.ClassType, prop: spec.Property) { this.getPythonType(cls.fqn).addMember( new Property( - toPythonPropertyName(prop.name), + toPythonPropertyName(prop.name, prop.const), prop.name, prop.type, { abstract: prop.abstract, immutable: prop.immutable }, @@ -1404,7 +1408,7 @@ class PythonGenerator extends Generator { ); } else { ifaceProperty = new InterfaceProperty( - toPythonPropertyName(prop.name), + toPythonPropertyName(prop.name, prop.const), prop.name, prop.type, { immutable: prop.immutable }, diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index bcedb26663..a435782453 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -64,9 +64,6 @@ xfail_literal_interface = pytest.mark.xfail( reason="Implement someone returning a literal interface", strict=True ) -xfail_const_naming = pytest.mark.xfail( - reason="Correct name of const (FOO != foo)", strict=True -) xfail_abstract_class = pytest.mark.xfail( reason="Implement (or fix?) abstract class property", strict=True ) @@ -794,7 +791,6 @@ def test_statics(): assert Statics.non_const_static == 100 -@xfail_const_naming def test_consts(): obj = Statics.CONST_OBJ From 3230bb4901ec02cdc2e82d2a84031318ec4c9a69 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 6 Feb 2019 20:41:38 -0500 Subject: [PATCH 099/117] Emit the JSII_AGENT environment variable --- .../src/jsii/_kernel/providers/process.py | 6 ++++++ packages/jsii-python-runtime/tests/test_compliance.py | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index a77b103dd8..e31d73cfeb 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -2,7 +2,9 @@ import contextlib import importlib.machinery import json +import os import os.path +import platform import subprocess import tempfile @@ -207,10 +209,14 @@ def _next_message(self) -> Mapping[Any, Any]: return json.loads(self._process.stdout.readline(), object_hook=ohook) def start(self): + environ = os.environ.copy() + environ["JSII_AGENT"] = f"Python/{platform.python_version()}" + self._process = subprocess.Popen( ["node", self._jsii_runtime()], stdin=subprocess.PIPE, stdout=subprocess.PIPE, + env=environ, ) self.handshake() diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index a435782453..8a4fef2145 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -67,9 +67,6 @@ xfail_abstract_class = pytest.mark.xfail( reason="Implement (or fix?) abstract class property", strict=True ) -xfail_jsii_agent = pytest.mark.xfail( - reason="Implement JSII_AGENT environment variable.", strict=True -) xfail_private_class = pytest.mark.xfail( reason="Implement receiving a private class", strict=True ) @@ -892,7 +889,6 @@ def test_nullShouldBeTreatedAsUndefined(): obj.verify_property_is_undefined() -@xfail_jsii_agent def test_testJsiiAgent(): assert JsiiAgent.jsii_agent == f"Python/{platform.python_version()}" From f8e920c27a77a7ec9b12a3b74535e9531070a02b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Feb 2019 07:22:10 -0500 Subject: [PATCH 100/117] Properly (De)Serialize Enums --- packages/jsii-pacmak/lib/targets/python.ts | 5 +++++ packages/jsii-python-runtime/src/jsii/__init__.py | 1 + .../jsii-python-runtime/src/jsii/_kernel/__init__.py | 3 +++ .../src/jsii/_kernel/providers/process.py | 10 ++++++++++ packages/jsii-python-runtime/src/jsii/_kernel/types.py | 7 +++++++ .../jsii-python-runtime/src/jsii/_reference_map.py | 7 +++++++ packages/jsii-python-runtime/src/jsii/_runtime.py | 9 +++++++++ packages/jsii-python-runtime/tests/test_compliance.py | 7 +------ 8 files changed, 43 insertions(+), 6 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 49233c6de9..8faea5df7a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -772,6 +772,11 @@ class Property extends BaseProperty { class Enum extends BasePythonClassType { + public emit(code: CodeMaker, resolver: TypeResolver) { + code.line(`@jsii.enum(jsii_type="${this.fqn}")`); + return super.emit(code, resolver); + } + protected getClassParams(_resolver: TypeResolver): string[] { return ["enum.Enum"]; } diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index ea769e4d08..9bf8c01e62 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -5,6 +5,7 @@ JSIIAssembly, JSIIMeta, JSIIAbstractClass, + enum, data_type, member, kernel, diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 089844545d..73075eea79 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -11,6 +11,7 @@ from jsii._kernel.providers import BaseKernel, ProcessKernel from jsii._kernel.types import JSClass, Referenceable from jsii._kernel.types import ( + EnumRef, LoadRequest, CreateRequest, DeleteRequest, @@ -65,6 +66,8 @@ def _recursize_dereference(kernel, d): return [_recursize_dereference(kernel, i) for i in d] elif isinstance(d, ObjRef): return _reference_map.resolve_reference(kernel, d) + elif isinstance(d, EnumRef): + return _recursize_dereference(kernel, d.ref)(d.member) else: return d diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index e31d73cfeb..3f305c730e 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -1,5 +1,6 @@ import datetime import contextlib +import enum import importlib.machinery import json import os @@ -22,6 +23,7 @@ from jsii._kernel.providers.base import BaseKernel from jsii._kernel.types import ( ObjRef, + EnumRef, KernelRequest, KernelResponse, LoadRequest, @@ -95,11 +97,18 @@ def _unstructure_ref(value): return {"$jsii.byref": value.ref} +def _unstructure_enum(member): + return {"$jsii.enum": f"{member.__class__.__jsii_type__}/{member.value}"} + + def ohook(d): if d.keys() == {"$jsii.byref"}: return ObjRef(ref=d["$jsii.byref"]) if d.keys() == {"$jsii.date"}: return dateutil.parser.isoparse(d["$jsii.date"]) + if d.keys() == {"$jsii.enum"}: + ref, member = d["$jsii.enum"].rsplit("/", 1) + return EnumRef(ref=ObjRef(ref=ref + "@"), member=member) return d @@ -116,6 +125,7 @@ def jdefault(obj): class _NodeProcess: def __init__(self): self._serializer = cattr.Converter() + self._serializer.register_unstructure_hook(enum.Enum, _unstructure_enum) self._serializer.register_unstructure_hook( LoadRequest, _with_api_key("load", self._serializer.unstructure_attrs_asdict), diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index 46b100f861..3a64c56fd5 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -17,6 +17,13 @@ class ObjRef: ref: str +@attr.s(auto_attribs=True, frozen=True, slots=True) +class EnumRef: + + ref: ObjRef + member: str + + @attr.s(auto_attribs=True, frozen=True, slots=True) class Override: diff --git a/packages/jsii-python-runtime/src/jsii/_reference_map.py b/packages/jsii-python-runtime/src/jsii/_reference_map.py index 827577afc1..9c4c4cd258 100644 --- a/packages/jsii-python-runtime/src/jsii/_reference_map.py +++ b/packages/jsii-python-runtime/src/jsii/_reference_map.py @@ -8,6 +8,7 @@ _types = {} _data_types: MutableMapping[str, Any] = {} +_enums: MutableMapping[str, Any] = {} def register_type(klass: JSClass): @@ -18,6 +19,10 @@ def register_data_type(data_type: Any): _data_types[data_type.__jsii_type__] = data_type +def register_enum(enum_type: Any): + _enums[enum_type.__jsii_type__] = enum_type + + class _FakeReference: def __init__(self, ref: str) -> None: self.__jsii_ref__ = ref @@ -71,6 +76,8 @@ def resolve(self, kernel, ref): # This is a hack, because our kernel expects an object that has a # __jsii_ref__ attached to it, and we don't have one of those. inst[name] = kernel.get(_FakeReference(ref), name) + elif class_fqn in _enums: + inst = _enums[class_fqn] else: raise ValueError(f"Unknown type: {class_fqn}") diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index f3d5307cdd..098d27b87b 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -76,6 +76,15 @@ class JSIIAbstractClass(abc.ABCMeta, JSIIMeta): pass +def enum(*, jsii_type): + def deco(cls): + cls.__jsii_type__ = jsii_type + _reference_map.register_enum(cls) + return cls + + return deco + + def data_type(*, jsii_type): def deco(cls): cls.__jsii_type__ = jsii_type diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index 8a4fef2145..9e9383d452 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -47,9 +47,6 @@ # Tests as closely as possible to make keeping them in sync easier. # These map distinct reasons for failures, so we an easily find them. -xfail_enums = pytest.mark.xfail( - reason="Implement (de)serialization of enums", strict=True -) xfail_union_property = pytest.mark.xfail( reason="Implement union properties", strict=True ) @@ -351,7 +348,6 @@ def test_getAndSetNonPrimitiveProperties(): assert calc.value == -6_400_000 -@xfail_enums def test_getAndSetEnumValues(): calc = Calculator() calc.add(9) @@ -363,11 +359,10 @@ def test_getAndSetEnumValues(): calc.string_style = CompositeOperation.CompositionStringStyle.Decorated - assert calc.string_property == CompositeOperation.CompositionStringStyle.Decorated + assert calc.string_style == CompositeOperation.CompositionStringStyle.Decorated assert calc.to_string() == "<<[[{{(((1 * (0 + 9)) * (0 + 9)) * (0 + 9))}}]]>>" -@xfail_enums def test_useEnumFromScopedModule(): obj = ReferenceEnumFromScopedPackage() assert obj.foo == EnumFromScopedModule.Value2 From 8e302a57936c9ebbd95acaeb2b6ead4114addbed Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Feb 2019 07:27:58 -0500 Subject: [PATCH 101/117] Minor linting fixes --- packages/jsii-python-runtime/src/jsii/__init__.py | 1 + packages/jsii-python-runtime/src/jsii/_runtime.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 9bf8c01e62..1a213e6bcb 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -38,6 +38,7 @@ "JSIIMeta", "JSIIAbstractClass", "Number", + "enum", "data_type", "member", "kernel", diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index 098d27b87b..da7699241f 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -1,5 +1,4 @@ import abc -import weakref import os import attr From 4a94600791525bafcd13c5d66fc58f59fa3cb71d Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Feb 2019 08:09:21 -0500 Subject: [PATCH 102/117] Properly serialize property_ -> property --- .../src/jsii/_kernel/providers/process.py | 33 ++++++++++++++++--- .../tests/test_compliance.py | 24 +++++++------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 3f305c730e..32051b8a3c 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -24,6 +24,7 @@ from jsii._kernel.types import ( ObjRef, EnumRef, + Override, KernelRequest, KernelResponse, LoadRequest, @@ -77,6 +78,17 @@ class _ErrorRespose: _ProcessResponse_R = _ProcessResponse +def _property_fix(asdict): + def unstructurer(value): + unstructured = asdict(value) + if "property_" in unstructured: + unstructured["property"] = unstructured.pop("property_") + + return unstructured + + return unstructurer + + def _with_api_key(api_name, asdict): def unstructurer(value): unstructured = asdict(value) @@ -139,18 +151,28 @@ def __init__(self): _with_api_key("del", self._serializer.unstructure_attrs_asdict), ) self._serializer.register_unstructure_hook( - GetRequest, _with_api_key("get", self._serializer.unstructure_attrs_asdict) + GetRequest, + _with_api_key( + "get", _property_fix(self._serializer.unstructure_attrs_asdict) + ), ) self._serializer.register_unstructure_hook( StaticGetRequest, - _with_api_key("sget", self._serializer.unstructure_attrs_asdict), + _with_api_key( + "sget", _property_fix(self._serializer.unstructure_attrs_asdict) + ), ) self._serializer.register_unstructure_hook( - SetRequest, _with_api_key("set", self._serializer.unstructure_attrs_asdict) + SetRequest, + _with_api_key( + "set", _property_fix(self._serializer.unstructure_attrs_asdict) + ), ) self._serializer.register_unstructure_hook( StaticSetRequest, - _with_api_key("sset", self._serializer.unstructure_attrs_asdict), + _with_api_key( + "sset", _property_fix(self._serializer.unstructure_attrs_asdict) + ), ) self._serializer.register_unstructure_hook( InvokeRequest, @@ -164,6 +186,9 @@ def __init__(self): StatsRequest, _with_api_key("stats", self._serializer.unstructure_attrs_asdict), ) + self._serializer.register_unstructure_hook( + Override, _property_fix(self._serializer.unstructure_attrs_asdict) + ) self._serializer.register_unstructure_hook(ObjRef, _unstructure_ref) self._serializer.register_structure_hook(ObjRef, _with_reference) diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index 9e9383d452..fd02dffb81 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -51,9 +51,6 @@ reason="Implement union properties", strict=True ) xfail_async = pytest.mark.xfail(reason="Implement async methods", strict=True) -xfail_override_property = pytest.mark.xfail( - reason="Rename property_ to property", strict=True -) xfail_error_handling = pytest.mark.xfail(reason="Implement Error Handling", strict=True) xfail_pure_object = pytest.mark.xfail( reason="Support sending arbitrary objects", strict=True @@ -67,6 +64,7 @@ xfail_private_class = pytest.mark.xfail( reason="Implement receiving a private class", strict=True ) +xfail_callbacks = pytest.mark.xfail(reason="Implement callback support", strict=True) class DerivedFromAllTypes(AllTypes): @@ -521,7 +519,7 @@ def override_me(self, mult): obj.call_me() -@xfail_override_property +@xfail_callbacks def test_syncOverrides(): obj = SyncOverrides() assert obj.caller_is_method() == 10 * 5 @@ -538,7 +536,7 @@ def test_syncOverrides(): assert obj.caller_is_async == 10 * 5 * 3 -@xfail_override_property +@xfail_callbacks def test_propertyOverrides_get_set(): so = SyncOverrides() assert so.retrieve_value_of_the_property == "I am an override!" @@ -546,7 +544,7 @@ def test_propertyOverrides_get_set(): assert so.another_the_property == "New Value" -@xfail_override_property +@xfail_callbacks def test_propertyOverrides_get_calls_super(): class SuperSyncVirtualMethods(SyncVirtualMethods): @property @@ -563,7 +561,7 @@ def the_property(self, value): assert so.the_property == "super:initial value" -@xfail_override_property +@xfail_callbacks def test_propertyOverrides_set_calls_super(): class SuperSyncVirtualMethods(SyncVirtualMethods): @property @@ -580,7 +578,7 @@ def the_property(self, value): assert so.the_property == "New Value:by override" -@xfail_override_property +@xfail_callbacks def test_propertyOverrides_get_throws(): class ThrowingSyncVirtualMethods(SyncVirtualMethods): @property @@ -597,7 +595,7 @@ def the_property(self, value): so.retrieve_value_of_the_property() -@xfail_override_property +@xfail_callbacks def test_propertyOverrides_set_throws(): class ThrowingSyncVirtualMethods(SyncVirtualMethods): @property @@ -649,7 +647,7 @@ def test_interfaceBuilder(): assert interact.write_and_read("Hello") == "Hello" -@xfail_override_property +@xfail_callbacks def test_syncOverrides_callsSuper(): obj = SyncOverrides() assert obj.caller_is_property == 10 * 5 @@ -657,7 +655,7 @@ def test_syncOverrides_callsSuper(): assert obj.caller_is_property == 10 * 2 -@xfail_override_property +@pytest.mark.skip def test_fail_syncOverrides_callsDoubleAsync_method(): obj = SyncOverrides() obj.call_async = True @@ -667,7 +665,7 @@ def test_fail_syncOverrides_callsDoubleAsync_method(): obj.caller_is_method() -@xfail_override_property +@pytest.mark.skip def test_fail_syncOverrides_callsDoubleAsync_propertyGetter(): obj = SyncOverrides() obj.call_async = True @@ -677,7 +675,7 @@ def test_fail_syncOverrides_callsDoubleAsync_propertyGetter(): obj.caller_is_property -@xfail_override_property +@pytest.mark.skip def test_fail_syncOverrides_callsDoubleAsync_propertySetter(): obj = SyncOverrides() obj.call_async = True From 086bd7ddafc8bf560ae45b27f6f1bd315a849588 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Feb 2019 08:27:45 -0500 Subject: [PATCH 103/117] Run our tests with JSII_DEBUG=1 --- packages/jsii-python-runtime/tests/conftest.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/jsii-python-runtime/tests/conftest.py diff --git a/packages/jsii-python-runtime/tests/conftest.py b/packages/jsii-python-runtime/tests/conftest.py new file mode 100644 index 0000000000..04db5eb90b --- /dev/null +++ b/packages/jsii-python-runtime/tests/conftest.py @@ -0,0 +1,3 @@ +import os + +os.environ["JSII_DEBUG"] = "1" From dab2db0c38c09013d81d4cbf9d955d328553e1b0 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 8 Feb 2019 09:42:42 -0500 Subject: [PATCH 104/117] Implement protected methods/properties having a _ prefix --- packages/jsii-pacmak/lib/targets/python.ts | 24 +++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8faea5df7a..674b480d2f 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -72,15 +72,25 @@ const toPythonIdentifier = (name: string): string => { return name; }; -const toPythonMethodName = (name: string): string => { - return toPythonIdentifier(toSnakeCase(name)); +const toPythonMethodName = (name: string, protectedItem: boolean = false): string => { + let value = toPythonIdentifier(toSnakeCase(name)); + if (protectedItem) { + value = "_" + value; + } + return value; }; -const toPythonPropertyName = (name: string, constant: boolean = false): string => { +const toPythonPropertyName = (name: string, constant: boolean = false, protectedItem: boolean = false): string => { let value = toPythonIdentifier(toSnakeCase(name)); + if (constant) { value = value.toUpperCase(); } + + if (protectedItem) { + value = "_" + value; + } + return value; }; @@ -1347,7 +1357,7 @@ class PythonGenerator extends Generator { this.getPythonType(cls.fqn).addMember( new Method( - toPythonMethodName(method.name!), + toPythonMethodName(method.name!, method.protected), method.name, parameters, method.returns, @@ -1359,7 +1369,7 @@ class PythonGenerator extends Generator { protected onProperty(cls: spec.ClassType, prop: spec.Property) { this.getPythonType(cls.fqn).addMember( new Property( - toPythonPropertyName(prop.name, prop.const), + toPythonPropertyName(prop.name, prop.const, prop.protected), prop.name, prop.type, { abstract: prop.abstract, immutable: prop.immutable }, @@ -1394,7 +1404,7 @@ class PythonGenerator extends Generator { this.getPythonType(ifc.fqn).addMember( new InterfaceMethod( - toPythonMethodName(method.name!), + toPythonMethodName(method.name!, method.protected), method.name, parameters, method.returns, @@ -1413,7 +1423,7 @@ class PythonGenerator extends Generator { ); } else { ifaceProperty = new InterfaceProperty( - toPythonPropertyName(prop.name, prop.const), + toPythonPropertyName(prop.name, prop.const, prop.protected), prop.name, prop.type, { immutable: prop.immutable }, From e33e46a80c45eddc06b895eba81b45906a05de97 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 8 Feb 2019 09:52:48 -0500 Subject: [PATCH 105/117] Remove the old debug method --- packages/jsii-pacmak/lib/targets/python.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 674b480d2f..25a12c200f 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -31,10 +31,6 @@ export default class Python extends Target { // ################## // # CODE GENERATOR # // ################## -export const debug = (o: any) => { - // tslint:disable-next-line:no-console - console.log(util.inspect(o, false, null, true)); -}; const PYTHON_BUILTIN_TYPES = ["bool", "str", "None"]; From a932eb6b41d39574d3128e1e173c35a32ab7bc8a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 8 Feb 2019 09:59:38 -0500 Subject: [PATCH 106/117] Opt into PEP 517 build backends --- packages/jsii-pacmak/lib/targets/python.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 25a12c200f..b8631d9f0b 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1010,7 +1010,8 @@ class Package { // TODO: Might be easier to just use a TOML library to write this out. code.openFile("pyproject.toml"); code.line("[build-system]"); - code.line('requires = ["setuptools", "wheel"]'); + code.line('requires = ["setuptools >= 35.0.2"]'); + code.line('build-backend = "setuptools.build_meta"'); code.closeFile("pyproject.toml"); // We also need to write out a MANIFEST.in to ensure that all of our required From 1953c8096ba2cc3689cf0789bbcad36cca03346b Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Fri, 8 Feb 2019 12:05:12 -0500 Subject: [PATCH 107/117] When packaging, emit actual dependency information --- packages/jsii-pacmak/lib/targets/python.ts | 62 +++++++++++++------ .../jsii-python-runtime/bin/generate-calc | 8 +-- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index b8631d9f0b..8ee3532f1d 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1,5 +1,4 @@ import path = require('path'); -import util = require('util'); import { CodeMaker, toSnakeCase } from 'codemaker'; import * as escapeStringRegexp from 'escape-string-regexp'; @@ -908,12 +907,6 @@ class Module implements PythonType { } } -interface PackageMetadata { - summary?: string; - readme?: string; - url?: string; -} - interface PackageData { filename: string; data: string | null; @@ -923,12 +916,12 @@ class Package { public readonly name: string; public readonly version: string; - public readonly metadata: PackageMetadata; + public readonly metadata: spec.Assembly; private modules: Map; private data: Map; - constructor(name: string, version: string, metadata: PackageMetadata) { + constructor(name: string, version: string, metadata: spec.Assembly) { this.name = name; this.version = version; this.metadata = metadata; @@ -977,21 +970,52 @@ class Package { packageData[mod] = pdata.map(pd => pd.filename); } + // Compute our list of dependencies + const dependencies: string[] = []; + const expectedDeps = this.metadata.dependencies || {}; + for (const depName of Object.keys(expectedDeps)) { + const depInfo = expectedDeps[depName]; + if (depInfo.peer) { + // We need to figure out what our version range is. + // Basically, if it starts with Zero we want to restrict things to + // ~=X.Y.Z. If it does not start with zero, then we want to do ~=X.Y,>=X.Y.Z. + const versionParts = depInfo.version.split("."); + let versionSpecifier: string; + if (versionParts[0] === "0") { + versionSpecifier = `~=${versionParts.slice(0, 3).join(".")}`; + } else { + versionSpecifier = `~=${versionParts.slice(0, 2).join(".")},>=${versionParts.slice(0, 3).join(".")}`; + } + + dependencies.push(`${toPythonPackageName(depName)}${versionSpecifier}`); + } + } + + code.openFile("README.md"); + code.line(this.metadata.readme !== undefined ? this.metadata.readme.markdown : ""); + code.closeFile("README.md"); + const setupKwargs = { name: this.name, version: this.version, - description: this.metadata.summary, - url: this.metadata.url, + description: this.metadata.description, + url: this.metadata.homepage, + long_description_content_type: "text/markdown", + author: this.metadata.author.name + ( + this.metadata.author.email !== undefined ? "<" + this.metadata.author.email + ">" : "" + ), + project_urls: { + Source: this.metadata.repository.url, + }, package_dir: {"": "src"}, packages: modules.map(m => m.name), package_data: packageData, python_requires: ">=3.6", - install_requires: ["publication"], + install_requires: ["jsii", "publication>=0.0.3"].concat(dependencies), }; // We Need a setup.py to make this Package, actually a Package. // TODO: - // - Author // - License // - Classifiers code.openFile("setup.py"); @@ -1002,6 +1026,10 @@ class Package { code.line(JSON.stringify(setupKwargs, null, 4)); code.line('""")'); code.line(); + code.openBlock("with open('README.md') as fp"); + code.line("kwargs['long_description'] = fp.read()"); + code.closeBlock(); + code.line(); code.line("setuptools.setup(**kwargs)"); code.closeFile("setup.py"); @@ -1010,7 +1038,7 @@ class Package { // TODO: Might be easier to just use a TOML library to write this out. code.openFile("pyproject.toml"); code.line("[build-system]"); - code.line('requires = ["setuptools >= 35.0.2"]'); + code.line('requires = ["setuptools >= 38.6.0", "wheel >= 0.31.0"]'); code.line('build-backend = "setuptools.build_meta"'); code.closeFile("pyproject.toml"); @@ -1244,11 +1272,7 @@ class PythonGenerator extends Generator { this.package = new Package( toPythonPackageName(assm.name), assm.version, - { - summary: assm.description, - readme: assm.readme !== undefined ? assm.readme.markdown : "", - url: assm.homepage, - }, + assm, ); const assemblyModule = new Module( diff --git a/packages/jsii-python-runtime/bin/generate-calc b/packages/jsii-python-runtime/bin/generate-calc index 15d726cd38..a062b62f44 100755 --- a/packages/jsii-python-runtime/bin/generate-calc +++ b/packages/jsii-python-runtime/bin/generate-calc @@ -25,9 +25,9 @@ subprocess.run( "--upgrade", "--find-links", os.path.abspath("."), - ] - + ["jsii"] # TODO: Remove this. - + [d for d in os.listdir(".env/jsii-calc") if d.endswith(".whl")], - cwd=os.path.abspath(".env/jsii-calc"), + "--find-links", + os.path.abspath(".env/jsii-calc"), + "jsii-calc", + ], check=True, ) From 8b214b95ba8db7d051a0fa46c69aca55c57e73cd Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 27 Feb 2019 15:57:57 -0500 Subject: [PATCH 108/117] Fix after merge --- packages/codemaker/package-lock.json | 870 +++++------------- packages/jsii-calc/package-lock.json | 650 +------------ packages/jsii-calc/test/assembly.jsii | 2 +- .../jsii-dotnet-jsonmodel/package-lock.json | 10 +- .../.jsii | 2 +- .../jsii-calc-0.7.15.tgz | Bin 72814 -> 72770 bytes .../calculator/jsii-calc@0.7.15.jsii.tgz | Bin 72814 -> 72770 bytes .../js/jsii-calc@0.7.15.jsii.tgz | Bin 72814 -> 72770 bytes .../jsii-python-runtime/bin/generate-calc | 2 +- 9 files changed, 215 insertions(+), 1321 deletions(-) diff --git a/packages/codemaker/package-lock.json b/packages/codemaker/package-lock.json index 3d99957cbd..834c0b56c1 100644 --- a/packages/codemaker/package-lock.json +++ b/packages/codemaker/package-lock.json @@ -1,26 +1,21 @@ { - "name": "codemaker", - "version": "0.7.14", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@types/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-nsaprOtNLvUrLyFX5+mRpE9h2Q0d5YzQRr+Lav3fxdYtc1/E/U7G+Ld861NWBDDtWY3MnwKoUOhCrE1nrVxUQA==", - "dev": true + "integrity": "sha512-nsaprOtNLvUrLyFX5+mRpE9h2Q0d5YzQRr+Lav3fxdYtc1/E/U7G+Ld861NWBDDtWY3MnwKoUOhCrE1nrVxUQA==" }, "@types/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-viw/LG++yGW9GP7ggfDpR+qpBz/NHFEbRTWNumTzebeUlURwfX+sjQfdfbiEoxXgJrj+1G8p4VN/bLquur7Hmg==", - "dev": true + "integrity": "sha512-viw/LG++yGW9GP7ggfDpR+qpBz/NHFEbRTWNumTzebeUlURwfX+sjQfdfbiEoxXgJrj+1G8p4VN/bLquur7Hmg==" }, "@types/fs-extra": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.5.tgz", "integrity": "sha512-w7iqhDH9mN8eLClQOYTkhdYUOSpp25eXxfc6VbFOGtzxW34JcvctH2bKjj4jD4++z4R5iO5D+pg48W2e03I65A==", - "dev": true, "requires": { "@types/node": "*" } @@ -28,20 +23,17 @@ "@types/node": { "version": "8.10.40", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.40.tgz", - "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==", - "dev": true + "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==" }, "@types/nodeunit": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/nodeunit/-/nodeunit-0.0.30.tgz", - "integrity": "sha1-SNLCcZoRjHcjuDMGw+gAsRor9ng=", - "dev": true + "integrity": "sha1-SNLCcZoRjHcjuDMGw+gAsRor9ng=" }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -52,14 +44,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -68,7 +58,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -76,38 +65,32 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -116,20 +99,17 @@ "bind-obj-methods": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", - "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", - "dev": true + "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==" }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -138,8 +118,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "camelcase": { "version": "5.0.0", @@ -149,32 +128,27 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "clean-yaml-object": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=" }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -182,20 +156,17 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", - "dev": true, "requires": { "growl": "~> 1.10.0", "js-yaml": "^3.11.0", @@ -209,7 +180,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -219,7 +189,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -228,7 +197,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -251,20 +219,17 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0", @@ -274,56 +239,47 @@ "ejs": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "events-to-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=" }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, "requires": { "cross-spawn": "^4", "signal-exit": "^3.0.0" @@ -332,14 +288,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -349,8 +303,7 @@ "fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", - "dev": true + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" }, "fs-extra": { "version": "7.0.1", @@ -365,20 +318,17 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "function-loop": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", - "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", - "dev": true + "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -387,7 +337,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -405,20 +354,17 @@ "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" @@ -428,7 +374,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -438,14 +383,12 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -454,39 +397,33 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, "optional": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -496,26 +433,22 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "jsonfile": { "version": "4.0.0", @@ -529,7 +462,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -540,20 +472,17 @@ "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=" }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -562,14 +491,12 @@ "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, "requires": { "mime-db": "~1.36.0" } @@ -578,7 +505,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -586,14 +512,12 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minipass": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", - "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -602,8 +526,7 @@ "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, @@ -611,7 +534,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -619,22 +541,19 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nodeunit": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", - "dev": true, "requires": { "ejs": "^2.5.2", "tap": "^12.0.1" @@ -644,7 +563,6 @@ "version": "11.9.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", - "dev": true, "requires": { "archy": "^1.0.0", "arrify": "^1.0.1", @@ -678,8 +596,6 @@ "align-text": { "version": "0.1.4", "bundled": true, - "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -688,76 +604,62 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, - "dev": true + "bundled": true }, "append-transform": { "version": "0.4.0", "bundled": true, - "dev": true, "requires": { "default-require-extensions": "^1.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-flatten": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-union": { "version": "3.1.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "arrify": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "assign-symbols": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "async": { "version": "1.5.2", - "bundled": true, - "dev": true + "bundled": true }, "atob": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "babel-code-frame": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -767,7 +669,6 @@ "babel-generator": { "version": "6.26.1", "bundled": true, - "dev": true, "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", @@ -782,7 +683,6 @@ "babel-messages": { "version": "6.23.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -790,7 +690,6 @@ "babel-runtime": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -799,7 +698,6 @@ "babel-template": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", @@ -811,7 +709,6 @@ "babel-traverse": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", @@ -827,7 +724,6 @@ "babel-types": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -837,18 +733,15 @@ }, "babylon": { "version": "6.18.0", - "bundled": true, - "dev": true + "bundled": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "base": { "version": "0.11.2", "bundled": true, - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -862,7 +755,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -870,7 +762,6 @@ "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -878,7 +769,6 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -886,7 +776,6 @@ "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -895,20 +784,17 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -917,7 +803,6 @@ "braces": { "version": "2.3.2", "bundled": true, - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -934,7 +819,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -943,13 +827,11 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, - "dev": true + "bundled": true }, "cache-base": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -964,15 +846,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "caching-transform": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "md5-hex": "^1.2.0", "mkdirp": "^0.5.1", @@ -982,13 +862,11 @@ "camelcase": { "version": "1.2.1", "bundled": true, - "dev": true, "optional": true }, "center-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "^0.1.3", @@ -998,7 +876,6 @@ "chalk": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -1010,7 +887,6 @@ "class-utils": { "version": "0.3.6", "bundled": true, - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -1021,22 +897,19 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "cliui": { "version": "2.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "center-align": "^0.1.1", @@ -1047,20 +920,17 @@ "wordwrap": { "version": "0.0.2", "bundled": true, - "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "collection-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -1068,38 +938,31 @@ }, "commondir": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "component-emitter": { "version": "1.2.1", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "convert-source-map": { "version": "1.5.1", - "bundled": true, - "dev": true + "bundled": true }, "copy-descriptor": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "core-js": { "version": "2.5.6", - "bundled": true, - "dev": true + "bundled": true }, "cross-spawn": { "version": "4.0.2", "bundled": true, - "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -1108,30 +971,25 @@ "debug": { "version": "2.6.9", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } }, "debug-log": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "decamelize": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true, - "dev": true + "bundled": true }, "default-require-extensions": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "strip-bom": "^2.0.0" } @@ -1139,7 +997,6 @@ "define-property": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -1148,7 +1005,6 @@ "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1156,7 +1012,6 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1164,7 +1019,6 @@ "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1173,20 +1027,17 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "detect-indent": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -1194,25 +1045,21 @@ "error-ex": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "esutils": { "version": "2.0.2", - "bundled": true, - "dev": true + "bundled": true }, "execa": { "version": "0.7.0", "bundled": true, - "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -1226,7 +1073,6 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -1238,7 +1084,6 @@ "expand-brackets": { "version": "2.1.4", "bundled": true, - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -1252,7 +1097,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -1260,7 +1104,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -1270,7 +1113,6 @@ "extend-shallow": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -1279,7 +1121,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -1289,7 +1130,6 @@ "extglob": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -1304,7 +1144,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -1312,7 +1151,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -1320,7 +1158,6 @@ "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1328,7 +1165,6 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1336,7 +1172,6 @@ "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1345,15 +1180,13 @@ }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "fill-range": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -1364,7 +1197,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -1374,7 +1206,6 @@ "find-cache-dir": { "version": "0.1.1", "bundled": true, - "dev": true, "requires": { "commondir": "^1.0.1", "mkdirp": "^0.5.1", @@ -1384,20 +1215,17 @@ "find-up": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "locate-path": "^2.0.0" } }, "for-in": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "foreground-child": { "version": "1.5.6", "bundled": true, - "dev": true, "requires": { "cross-spawn": "^4", "signal-exit": "^3.0.0" @@ -1406,35 +1234,29 @@ "fragment-cache": { "version": "0.2.1", "bundled": true, - "dev": true, "requires": { "map-cache": "^0.2.2" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "get-stream": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-value": { "version": "2.0.6", - "bundled": true, - "dev": true + "bundled": true }, "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1446,18 +1268,15 @@ }, "globals": { "version": "9.18.0", - "bundled": true, - "dev": true + "bundled": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "dev": true + "bundled": true }, "handlebars": { "version": "4.0.11", "bundled": true, - "dev": true, "requires": { "async": "^1.4.0", "optimist": "^0.6.1", @@ -1468,7 +1287,6 @@ "source-map": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "amdefine": ">=0.0.4" } @@ -1478,20 +1296,17 @@ "has-ansi": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "has-flag": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "has-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -1500,15 +1315,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "has-values": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -1517,7 +1330,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -1525,7 +1337,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1535,7 +1346,6 @@ "kind-of": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1544,18 +1354,15 @@ }, "hosted-git-info": { "version": "2.6.0", - "bundled": true, - "dev": true + "bundled": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1563,44 +1370,37 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "invariant": { "version": "2.2.4", "bundled": true, - "dev": true, "requires": { "loose-envify": "^1.0.0" } }, "invert-kv": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" } }, "is-arrayish": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-buffer": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "builtin-modules": "^1.0.0" } @@ -1608,7 +1408,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -1616,7 +1415,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -1625,33 +1423,28 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "is-extendable": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-finite": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -1659,72 +1452,60 @@ "is-odd": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "^4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "is-plain-object": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "is-stream": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "is-utf8": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-windows": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isexe": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-coverage": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-hook": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "append-transform": "^0.4.0" } @@ -1732,7 +1513,6 @@ "istanbul-lib-instrument": { "version": "1.10.1", "bundled": true, - "dev": true, "requires": { "babel-generator": "^6.18.0", "babel-template": "^6.16.0", @@ -1746,7 +1526,6 @@ "istanbul-lib-report": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "istanbul-lib-coverage": "^1.1.2", "mkdirp": "^0.5.1", @@ -1757,7 +1536,6 @@ "supports-color": { "version": "3.2.3", "bundled": true, - "dev": true, "requires": { "has-flag": "^1.0.0" } @@ -1767,7 +1545,6 @@ "istanbul-lib-source-maps": { "version": "1.2.3", "bundled": true, - "dev": true, "requires": { "debug": "^3.1.0", "istanbul-lib-coverage": "^1.1.2", @@ -1779,7 +1556,6 @@ "debug": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } @@ -1789,25 +1565,21 @@ "istanbul-reports": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "handlebars": "^4.0.3" } }, "js-tokens": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "jsesc": { "version": "1.3.0", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1815,13 +1587,11 @@ "lazy-cache": { "version": "1.0.4", "bundled": true, - "dev": true, "optional": true }, "lcid": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -1829,7 +1599,6 @@ "load-json-file": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -1841,7 +1610,6 @@ "locate-path": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -1849,26 +1617,21 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "lodash": { "version": "4.17.10", - "bundled": true, - "dev": true + "bundled": true }, "longest": { "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "loose-envify": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "js-tokens": "^3.0.0" } @@ -1876,7 +1639,6 @@ "lru-cache": { "version": "4.1.3", "bundled": true, - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1884,13 +1646,11 @@ }, "map-cache": { "version": "0.2.2", - "bundled": true, - "dev": true + "bundled": true }, "map-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -1898,20 +1658,17 @@ "md5-hex": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "md5-o-matic": "^0.1.1" } }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "mem": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -1919,22 +1676,19 @@ "merge-source-map": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, - "dev": true + "bundled": true } } }, "micromatch": { "version": "3.1.10", "bundled": true, - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -1953,33 +1707,28 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "mimic-fn": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "mixin-deep": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -1988,7 +1737,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -1998,20 +1746,17 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "nanomatch": { "version": "1.2.9", "bundled": true, - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -2029,25 +1774,21 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -2058,25 +1799,21 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "object-assign": { "version": "4.1.1", - "bundled": true, - "dev": true + "bundled": true }, "object-copy": { "version": "0.1.0", "bundled": true, - "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -2086,7 +1823,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2096,37 +1832,32 @@ "object-visit": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "isobject": "^3.0.0" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "object.pick": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1" } @@ -2134,7 +1865,6 @@ "optimist": { "version": "0.6.1", "bundled": true, - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -2142,13 +1872,11 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "os-locale": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", @@ -2157,13 +1885,11 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "p-limit": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -2171,56 +1897,47 @@ "p-locate": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "parse-json": { "version": "2.2.0", "bundled": true, - "dev": true, "requires": { "error-ex": "^1.2.0" } }, "pascalcase": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "path-exists": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-key": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-parse": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "path-type": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -2229,18 +1946,15 @@ }, "pify": { "version": "2.3.0", - "bundled": true, - "dev": true + "bundled": true }, "pinkie": { "version": "2.0.4", - "bundled": true, - "dev": true + "bundled": true }, "pinkie-promise": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -2248,7 +1962,6 @@ "pkg-dir": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "find-up": "^1.0.0" }, @@ -2256,7 +1969,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -2266,18 +1978,15 @@ }, "posix-character-classes": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "read-pkg": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -2287,7 +1996,6 @@ "read-pkg-up": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -2296,7 +2004,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -2306,13 +2013,11 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true, - "dev": true + "bundled": true }, "regex-not": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -2320,51 +2025,42 @@ }, "repeat-element": { "version": "1.1.2", - "bundled": true, - "dev": true + "bundled": true }, "repeat-string": { "version": "1.6.1", - "bundled": true, - "dev": true + "bundled": true }, "repeating": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-finite": "^1.0.0" } }, "require-directory": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "resolve-from": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "resolve-url": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "ret": { "version": "0.1.15", - "bundled": true, - "dev": true + "bundled": true }, "right-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "^0.1.1" @@ -2373,7 +2069,6 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "requires": { "glob": "^7.0.5" } @@ -2381,25 +2076,21 @@ "safe-regex": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "ret": "~0.1.10" } }, "semver": { "version": "5.5.0", - "bundled": true, - "dev": true + "bundled": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "set-value": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -2410,7 +2101,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2420,30 +2110,25 @@ "shebang-command": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "slide": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "snapdragon": { "version": "0.8.2", "bundled": true, - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -2458,7 +2143,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2466,7 +2150,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2476,7 +2159,6 @@ "snapdragon-node": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -2486,7 +2168,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -2494,7 +2175,6 @@ "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2502,7 +2182,6 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2510,7 +2189,6 @@ "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2519,33 +2197,28 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "snapdragon-util": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.2.0" } }, "source-map": { "version": "0.5.7", - "bundled": true, - "dev": true + "bundled": true }, "source-map-resolve": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "atob": "^2.0.0", "decode-uri-component": "^0.2.0", @@ -2556,13 +2229,11 @@ }, "source-map-url": { "version": "0.4.0", - "bundled": true, - "dev": true + "bundled": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, - "dev": true, "requires": { "foreground-child": "^1.5.6", "mkdirp": "^0.5.0", @@ -2575,7 +2246,6 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -2583,13 +2253,11 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, - "dev": true + "bundled": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -2597,13 +2265,11 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "split-string": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -2611,7 +2277,6 @@ "static-extend": { "version": "0.1.2", "bundled": true, - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -2620,7 +2285,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2630,7 +2294,6 @@ "string-width": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -2638,13 +2301,11 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -2654,7 +2315,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2662,25 +2322,21 @@ "strip-bom": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "supports-color": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "test-exclude": { "version": "4.2.1", "bundled": true, - "dev": true, "requires": { "arrify": "^1.0.1", "micromatch": "^3.1.8", @@ -2691,18 +2347,15 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "braces": { "version": "2.3.2", "bundled": true, - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -2719,7 +2372,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2729,7 +2381,6 @@ "expand-brackets": { "version": "2.1.4", "bundled": true, - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -2743,7 +2394,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2751,7 +2401,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2759,7 +2408,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -2767,7 +2415,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -2777,7 +2424,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -2785,7 +2431,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -2795,7 +2440,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -2804,15 +2448,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "extglob": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -2827,7 +2469,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -2835,7 +2476,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2845,7 +2485,6 @@ "fill-range": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -2856,7 +2495,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2866,7 +2504,6 @@ "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2874,7 +2511,6 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2882,7 +2518,6 @@ "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2892,7 +2527,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -2900,7 +2534,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -2909,18 +2542,15 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true }, "micromatch": { "version": "3.1.10", "bundled": true, - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -2941,13 +2571,11 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "to-object-path": { "version": "0.3.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -2955,7 +2583,6 @@ "to-regex": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -2966,7 +2593,6 @@ "to-regex-range": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -2975,7 +2601,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -2984,13 +2609,11 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "uglify-js": { "version": "2.8.29", "bundled": true, - "dev": true, "optional": true, "requires": { "source-map": "~0.5.1", @@ -3001,7 +2624,6 @@ "yargs": { "version": "3.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "camelcase": "^1.0.2", @@ -3015,13 +2637,11 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "union-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -3032,7 +2652,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -3040,7 +2659,6 @@ "set-value": { "version": "0.4.3", "bundled": true, - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -3053,7 +2671,6 @@ "unset-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -3062,7 +2679,6 @@ "has-value": { "version": "0.3.1", "bundled": true, - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -3072,7 +2688,6 @@ "isobject": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "isarray": "1.0.0" } @@ -3081,40 +2696,34 @@ }, "has-values": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "urix": { "version": "0.1.0", - "bundled": true, - "dev": true + "bundled": true }, "use": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "validate-npm-package-license": { "version": "3.0.3", "bundled": true, - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -3123,31 +2732,26 @@ "which": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "window-size": { "version": "0.1.0", "bundled": true, - "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, - "dev": true + "bundled": true }, "wrap-ansi": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -3156,7 +2760,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3164,7 +2767,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3175,13 +2777,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "write-file-atomic": { "version": "1.3.4", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -3190,18 +2790,15 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "2.1.2", - "bundled": true, - "dev": true + "bundled": true }, "yargs": { "version": "11.1.0", "bundled": true, - "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -3219,18 +2816,15 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true }, "cliui": { "version": "4.1.0", "bundled": true, - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -3240,7 +2834,6 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -3248,7 +2841,6 @@ "yargs-parser": { "version": "9.0.2", "bundled": true, - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -3258,15 +2850,13 @@ "yargs-parser": { "version": "8.1.0", "bundled": true, - "dev": true, "requires": { "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -3275,14 +2865,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -3290,26 +2878,22 @@ "opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "own-or": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", - "dev": true + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=" }, "own-or-env": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", - "dev": true, "requires": { "own-or": "^1.0.0" } @@ -3317,51 +2901,43 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, "optional": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -3377,7 +2953,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -3405,7 +2980,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -3413,32 +2987,27 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3447,14 +3016,12 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -3470,14 +3037,12 @@ "stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -3487,7 +3052,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3496,7 +3060,6 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/tap/-/tap-12.0.1.tgz", "integrity": "sha512-iEJytWaZy8risvfRjuV4+ST+Lrrui/MW2ZCWn01ZaMn0NKFej4+PpBy6bXGOg9+cEGNmI7d3Sdka/zTUZUGidA==", - "dev": true, "requires": { "bind-obj-methods": "^2.0.0", "bluebird": "^3.5.1", @@ -3533,7 +3096,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz", "integrity": "sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA==", - "dev": true, "requires": { "color-support": "^1.1.0", "debug": "^2.1.3", @@ -3550,7 +3112,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", - "dev": true, "requires": { "events-to-array": "^1.0.1", "js-yaml": "^3.2.7", @@ -3563,7 +3124,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, "requires": { "events-to-array": "^1.0.1", "js-yaml": "^3.2.7", @@ -3573,14 +3133,12 @@ "tmatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", - "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", - "dev": true + "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -3589,20 +3147,17 @@ "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", - "dev": true + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=" }, "tsame": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.0.tgz", - "integrity": "sha512-dAuzcnOPdqZYojylFQzEes95UDjve3HqKrlTCeLZKSDPMTsn3smzHZqsJj/sWD8wOUkg0RD++B11evyLn2+bIw==", - "dev": true + "integrity": "sha512-dAuzcnOPdqZYojylFQzEes95UDjve3HqKrlTCeLZKSDPMTsn3smzHZqsJj/sWD8wOUkg0RD++B11evyLn2+bIw==" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -3611,20 +3166,17 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, "optional": true }, "typescript": { "version": "3.3.3333", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", - "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", - "dev": true + "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==" }, "unicode-length": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, "requires": { "punycode": "^1.3.2", "strip-ansi": "^3.0.1" @@ -3639,20 +3191,17 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, "optional": true }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -3663,7 +3212,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -3671,14 +3219,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -3688,14 +3234,12 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yapool": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", - "dev": true + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=" } } } diff --git a/packages/jsii-calc/package-lock.json b/packages/jsii-calc/package-lock.json index c67dd63ff7..011e664bef 100644 --- a/packages/jsii-calc/package-lock.json +++ b/packages/jsii-calc/package-lock.json @@ -1,657 +1,11 @@ { - "name": "jsii-calc", - "version": "0.7.14", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/node": { "version": "8.10.40", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.40.tgz", - "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "case": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.1.tgz", - "integrity": "sha512-N0rDB5ftMDKANGsIBRWPWcG0VIKtirgqcXb2vKFi66ySAjXVEwbfCN7ass1mkdXO8fbol3RfbWlQ9KyBX2F/Gg==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "jsii": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/jsii/-/jsii-0.7.14.tgz", - "integrity": "sha512-OubxHy72hFa/MSrv3x9vG/AHt6/cnioM4jHhe8CDIvcT7+DP14lMQGZbHkj6i58V2HRhJECxi8reie36zmt/Qg==", - "dev": true, - "requires": { - "case": "^1.6.1", - "colors": "^1.3.3", - "deep-equal": "^1.0.1", - "fs-extra": "^7.0.1", - "jsii-spec": "^0.7.14", - "log4js": "^4.0.1", - "semver": "^5.6.0", - "sort-json": "^2.0.0", - "spdx-license-list": "^5.0.0", - "typescript": "^3.2.4", - "yargs": "^12.0.5" - } - }, - "jsii-spec": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/jsii-spec/-/jsii-spec-0.7.14.tgz", - "integrity": "sha512-sdpuSNpMh2W4m40rMovpTiUVp57QeN7Tfi9weaHzpO4d5vi8yRL+jYIE4H00MoCfaJrYVbKPYpJtcGEri6drRA==", - "dev": true, - "requires": { - "jsonschema": "^1.2.4" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "log4js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", - "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", - "dev": true, - "requires": { - "date-format": "^2.0.0", - "debug": "^3.1.0", - "flatted": "^2.0.0", - "rfdc": "^1.1.2", - "streamroller": "^1.0.1" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sort-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.0.tgz", - "integrity": "sha512-OgXPErPJM/rBK5OhzIJ+etib/BmLQ1JY55Nb/ElhoWUec62pXNF/X6DrecHq3NW5OAGX0KxYD7m0HtgB9dvGeA==", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "detect-newline": "^2.1.0", - "minimist": "^1.2.0" - } - }, - "spdx-license-list": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-5.0.0.tgz", - "integrity": "sha512-N5u9tEFRBUzQDjMKRRt8SHxC/UaqYApPmdF4MMFnICQg3z52onNbnneuro/sWw2rd+eGu9agQOzUbD671Xia7Q==", - "dev": true - }, - "streamroller": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", - "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", - "dev": true, - "requires": { - "async": "^2.6.1", - "date-format": "^2.0.0", - "debug": "^3.1.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "typescript": { - "version": "3.3.3333", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", - "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==" } } } diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index 51a1ac5fa9..1911171cc8 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -3949,5 +3949,5 @@ } }, "version": "0.7.15", - "fingerprint": "vzzjYk0Hbo0lF9tGOMPQLWPG2MEEfhY22eDkXY+LDEE=" + "fingerprint": "IWSOEhdZzuvrss5K2WBjZCawXayV13yCAKTj/kJ9+mo=" } diff --git a/packages/jsii-dotnet-jsonmodel/package-lock.json b/packages/jsii-dotnet-jsonmodel/package-lock.json index d7c09becf3..142c4abd49 100644 --- a/packages/jsii-dotnet-jsonmodel/package-lock.json +++ b/packages/jsii-dotnet-jsonmodel/package-lock.json @@ -1,20 +1,16 @@ { - "name": "jsii-dotnet-jsonmodel", - "version": "0.7.14", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/node": { "version": "8.10.40", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.40.tgz", - "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==", - "dev": true + "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==" }, "typescript": { "version": "3.3.3333", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", - "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", - "dev": true + "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==" } } } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii index 51a1ac5fa9..1911171cc8 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii @@ -3949,5 +3949,5 @@ } }, "version": "0.7.15", - "fingerprint": "vzzjYk0Hbo0lF9tGOMPQLWPG2MEEfhY22eDkXY+LDEE=" + "fingerprint": "IWSOEhdZzuvrss5K2WBjZCawXayV13yCAKTj/kJ9+mo=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.15.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/jsii-calc-0.7.15.tgz index 98fd2d0f53be3df1accb1b0300b13c6ef49b2b8c..ed86b811e526056a84c870825fa150c655b7fcf4 100644 GIT binary patch delta 67347 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 !!`m+{EknTQ zK)k5nxCKZRjJqagyKATrynlFc+Y$r6r3tSZ zTDShT_=I`;CB{Tij#!Cv#7bF?s0SRe5^zNAb#-Mo_I8fX z88juhy1quxXx*A#)rxTeLc`lfrKw&(uLR?+rtxJhPWA$Ljgq|@ki8a=z4p5HHiPWM zfV$(`hX0z^rbZt4;5v_ECCt7nUf&s6I$9%z&iE+o8Vqy~3FWno;#03}5Xym=Z@cwk ze2pmQ?V~8Kl~A0u^?x*!SK}zJmPGkxfbpt~@%nr;!DbA+&63c)70_)afJ5Gh^VTvh7@y#k~(Zy%*}wSSV_V%7;D4fpk$q=75B37?5*NoQ zl*N&4K`5y#{A&Tp0OJ-{jL?=TM!mbHu9Z-XtbK%b^|!?pBeV_YE2|_QFLA__sb$eD zVamDz5het`Y;MIh5VU0;#Y(qRTUU#F6s)~GH_;4!zt;4-A8Kp)VDNSV5@=2g@wPbI zL0g6(j+-}3dw)xoTT$g(+tA}2sKX)1ug4HoT#%qG6JUL9Q&&611(>yuGQnnXIf1rI zDY&iH%OSUl5yVdl7!EL1irBgomS}NV<@erf?rU;Bne?*?Nfc4 zP~r_6426ajS^-#HoKGsa&*S^ejeM0BBMmf9vBhs= zwyuEsj@Y^lVe8%owyyfRzLMkmAbN3!Egi54jyke>fuC^y`B38xrY(W%EfdLRMu+mmwou*jq83Y!AdI|ylu=8>_Ruy((QjEqt;^_RZJ^~9JMAmYF%(t zb@O$75=R9WcgVrh15kyWHs(pQn{Glc4N$gHLbg|!5?|YR+v#o=kDqz_D5+M8JM+*s z>WGT_3Y1Uag?K@R}rmwM=WS-m9`o7dv!B5-Z46 z)k|b)pe@m0rM|XNuNP-V-abZy63kd3A*=JrkHj;%WfQqU9(P3ouDU)S;Nn@_(n(waTs;9?LIjS0hM1#aj1H~~T|6hY z0xZKf_o`*;$^i%pxHG!3j808=L@!aE2Zf_rLQzy%UcR%k0gg(yuyFA95#fLcqkp)z z*_f~pab~=hcgo?{ta2;U46k25kY9{S8k{|S1nzK$iiRr&RxUzI2JLvhtM;}yMxZTW zWMh4Gquwd*>GAfdD;4qVWJwMR)4>4;y?tGOJ0JEAQl|{Ia*5ORP{CJa*lPL2-5t5K zzt^S>7-(Gui}PJ7#K*Ob;vNUIC4Z{v#!9!kUOY(S?IV1=UR=kor>WZS7@aRh*JH+O zy`=G47shK{GG6%qc?i&Y%y_MrG+yh%c&$suYkt5<#*02mBW$EvpoJsVf{q8Eb8({< zTi;$_*P1dj^DEm&tEWzrJz5fQF|J!F?l41JzD~SRtyhb!ldyGSY9F;nD}N=l{t6&` zPWwN^{-49v*3NNzXHLCFfAaVLtk*W`@%=y5`o`M#{XZ}9lh}@%_-O!(^bO_E)C}7* z^4bfjuUD$e;Pu%f)g3GKYIQa9C1iNu_lJjvib})aE}%CS8_Ik03ST_mIXh}AjpJ=) z>*RR5b>2ETZY#SdXUau;XMb5a+xc*IvVF0IUoTUu?NWP>1(PInUIq{6 zyb{|F`HU76uaC7328PNGfP-H)@W@#McU5O^k^UNa;KE|o0bMx!TI^)Rwz`SiDLW(D zcA|PbOs8WLZMHeuQ);x7J?iz9O?Fzw^nz_vakv~e0T`&Ov1|7FzJKC8*tm=U{-f=i z{utAUea8h$isSKq(%ul)H1}N9CV$fpDJubB^i)gPp{^4^P;s=N)__L62q*vz(3W?@ z58LA-Ol{K8fKcCctYrlZiuhm=(91X*{1zA4*d8#)<~{L-boDg9-%w2| z!jepNx^-JO?@fJ#eYuLvAG`zO5ui26IN)e{6}2O#h<2q7guEj(AiE>iWJuK$4S<62zp3kkdjDFl{l7KmZu(__PM94vOSn zH7(k9%H&_tOUtNDkpVT8vyvL<1)<#l4W<^}LNAx}K(*rgXj^o)m6buuyI7>doGJ$I z3ftq#3Zj4TS|E)fu6>%1AWW9?uoPlp+n{9{^WIPpA>Klq18|IV9Prumo)``U;J7MC zRryd9#c4a_9;T~sC?Xfi!b9KG`jRpLV)+gp4hP1&H;I(U#kif9$%$eBhWYUxrYJa> zWohD_1-bQQRt4~(?^q-h@S52(F$tffc~Tz>J=K4Wi2t$@M<2%?aC=`Kq)GC*nqD8!E8bVI6d zp(^J#K9%Be83;sH8ZST~7dT-{130j=2u+BGb?%9Xo*af7dJCRs0lzE>g)g>TTS9Gn zqYi)Q4z4_e-$C3(kP~=Z6lfsQ;|aGyP?^kKuC9F>8;< z`uUv15fx_d1GNk<8F*aHbwC*}BNaNTMSO&{-~dPDe2i>y-!@8tjC3PJ6ynMEBIls* z(FW(4qCj`aW5EAIm_Q?%7QSrZf!t-;WCee&kT>>xW8lduoPt9%A#`Q4Xu-&jmXCQW zfv+VaeOXc?5iXFhjd%keR~xaUFO5ih_JkXGMH(+OO~#`@LUgWzA8~ zgYY5~-UEG!|A{xUKwoexPMQ;hhV8=GNMFjN+9*JBd!*t^>hzYR>ms?u^pE-F^ z;P?;^ND5)=DoU%1^bcYo4>W%j@^nBH-|R6E)SiluNy+iReK9mxfp6_Pp7)v%rqG$J z5&BQ;GaWIv)CX^5`Z!g~=rJQeWhEH!p-&Lgig^l-ZF(ZWJsxU@{b(U^#$sB69s}}J zea!pfw4$6STqY5Wa!C<^Mkr(4evE zL{+j6@krulGNWS5jx>KJOWcI6G{#XFzq6!{i!6i{q-^997Cm~>@O1OBU}@}=9fs7| z#Ic{~$eJ{=Yxp2w%ffG#LU@V}0HXNhq=AD0LxxzUO00o(T;|-pjA~Ig&~I9noC#u4 zKNL4UHYi9w3@6l%)pFr&R80d0K%IID>c##Y$7y;c5b~TTp2GBot{b*K8VI*F z!ZAXzu=r1qGp^GJ!6J!)Cm+&;iLzCAww!N%j`JTwOxC(ZDvH9Wg4|Y0)-wknmiUrL zft~Pq$RJ}%&g{~LXUWS=@!-SMUdoaY>qc5Da=IzdEQex4wYcqZMkpd@=K@ip{%~k1 zn->C*Sgn7GSmD6y##}PF(#S`Vv`i4G#3F$RLDneP;VS_wRt>#CucBPAlVV6T;}HhZ zObmaiM`?j1$Zw3}UZj-FlG0e2sjJY_#}VU+9OmkESFbg zy?^ZZ_)@TXL-wWPu%HaZwnyO|nh^rc8-Y3S4BdZV3qdFb5=r<#%)4L-Qov#m67?Xa zBgP+d389G0cr-Lg#gpO<5aJp=)n)5S@z{f}1+0TA6b^`oYEkl|b%!*k&s=V4MF1?!U|IpO;FK^-4fca~X+Ek4G(nS2Bn89o z3~+yWdPK)?Fv+CB1UV^!paV0tiTtdPCP6oD4N^=1!_-Da*)}~2o!AMvD=b=NR! zN~^t~G#l+!TOjwUb-sUcajsl7&dwUg=dBN&wsLYNFUz0oDvjeC<$aUqJSTrVZ=E0R zECbe$U$>5T&sxWOJ4ZXm=gZ2`&KVZ9Id3#uhpqD)VxisE`SDJhZ69dxK0Y+gfM6Gg zjWgxL#o33G_71bQY_-rbs4Rgu#QKP|>OdB) z(DEt<7GfbdSRe3}MafQp5h86V)go51eB9G2r3`GNXPG@b1+=srtadL)Qn^9qXCl8Z zGDiV(`j*)thmL^jVLl>Qw-7`6xC6nX)$w%sVA?ZcJ}@aGNM@NdFwcJo5NXu`ZUvKb z`1rQi5)f_<@P-DitxK!VAW-1gvZVxcU|3EU7vy-SLPKND4dBLfwaeDb(TWGQ8dr_u zfi7Wl6zG@{`^L06F(th!XABl|*Te->IBm;e4BK-Y9Si(Oxx+g!%Fb}8_Gth1U^qg+ zyQ*o8TxN|_t2?qo=Z1fbV9HJqTm?YpmGQv_HauV)RNxOXe z21o!$g4o=^yJr%xSy38v92c=5G%t?a2o1F)6jyz8-J{|fUo6aBZWCUp)^{A11*J@9 zWU-xcuHd(I4bmse{J=1lJYkaFol+6>)iQscImUg;REUNrQJ0f>vu>($`*h|9rNuA^42|kMxZHEusAm9xo`4rE z4;QFdYn~?+TAbQ4z5y;nkCla8q>n{$vZ1yoVqT9$WUw(;D$@bOKX z$Ec(?19l7iA0y zQ2y65<-fLGPn`d&ZQz-}@ACirKkS}>1%7bEWhHiEmo=!?gF5!Ggn!EYLkpPA@(h2f zw?Fc`Z>75~7Nknd$@d`kFkF*l-Qw2@ICQr{tet72h_f99N9r)YLCX7}$r4w&Ef^kn zI_vRE<>=du3OhWL@i2ZtiF~s#Qwsd*15lO+Z5bQ3vjg$aiM@k0AChp|&aP@%{D9z= zN;ht|LDgyfw6?7QTQhCgospxbhue~|CXi?soh;8^#@ z0ceyXftgqnFN3Mr_s1j4+UgtHT}tOZ=1__2cG~E*MsKC#>68fJ7k>Kb%}*7d-v`d= zw!k*!#9G>pZv4)u8EgJ~u+8N6&iHp!{=Xv(d-CQJvOcdBPwn!8O_t&F-Nt{WZm<>W zARPsktJ1^$gSO)uFMkPz(ElJMZ?wQ*R&>DA+{Vb&|DfyF67gSs1KWSs|Ih!!c3dm} zR)VWmmKC~Y3_`zM*EDP$xb+L$<@00OrDQ+;{OZk5KfO|ZQg(0!r_0_k4OiR}hueC> zi{zL$7aYc_z>9BQvHI>(u}FV0v`INCAO7?taF}VLQSs*|rH$La97perjf(j0|ML6( zl!kbubTC^7%3HK~L%;dc#ie)rLY$w|y6>v4@nBe1^j-0-{PGup51|u0#Rbs^{IMFj zUe=t?069R$zo^wQHRA6=;GLK(SLvWm_;y;k^R(%wHem4EfLw%~JwwHuF#QX>&EV0JY>P^#z5G7#T0HW}lfbEj( zgIhdlImzmK?-6FZtj9^k#(8Un&WeHZ6JXiXEz?DuaTjG+)!rvG0lq3dt0S!_y&Jf+u^#HkXq{pyH zC0Ig+!e`;NURlumR0^6ScHPG~6QmTXo4B%>D`914kfS=%v_iVHaU?WkQNRShf@;bN zSfGe7TuhRM*fe?95e}EREBbsXMl##r=N&@07Z+Z$`a4V6q&vpfi~zWQiz0NJfj$W# zC`q(n$`?K^$eMh!gvPEX!$Jh&<{9bo-?Z5WH=T)hC5lLDWe!&lN3=zZMYa;xs%5fC z1TY5NdFnlgQj0gi-_q5G@6zt?+e*C{?&qwLr@iko6}IFRmxA8E{#F2jk~f@A0zq__ z216dlXV9m_CBO2k1+V*mO`VKX_LPGg0ufOz_>(25><+VsAlP{;ZKQeV9R6#7A zGh??Y0suz8$wg<6=BWMWUF|!-qvSALG65_NSXS#{f z6qY5Z%i#M%SfQRID$En4hcaOUeADAd&&fVIKs3N5E5SMjAaw!q#qJuS_~!T6YDU% z380cmPI?h=6vOdSf(z-Ol8l&GpYSM)fg5;#3*TZaDHO5(fm>=rl!~MEeD6pwK-ANu zrbp^fPAvcG422o^Ev6a1q`+i3z2xW<$2@d;vA$zC;=Ct+n1?ZrIMSlYtS$`%FQxIZ z46m+x;k`I~kt>HDz^aQ8Lk}kM-ZAw=$2|No`Ck7h@8b@n)JPxHM6vGARMX4unv_#a zu{#gNdS=dlO4sq61i1(4!11JpAMtfEcp$?Mk-FRAm7l2AR&eDC+sH@THIag0!8=w6 zOCF1!aqT#N2428G`9EQR`X6QhvZrD6Ida9mZd+0VcrL#y>Ig0+CwYO5X<~9vNhINS zhyYIo+Un=@)N)4t_w)R+zZ3Gm>$Q44vHo9QtAD@$_eFjdaBC%Bh57jvs{l}8JSX^i zk(o^BG#*aUGY;!hx1ONI_bSyH*UL}tGU*ahI zxmYHDvS{kDXK*u;HYI_b3RAOx575HCkkKMVkBM$RE&iW>i>|&vFZ>hq^JVE%5(NnK zF9`b2#nPMw^P1)7`_o+J`&0US2^f(~OW~$HzU)GoD>1ph{wTj5Cf!or-{lYaF$DPK zMBirl)a09QHY2?WOB)O*Y*)i?KAAejD zZd59a;$aGDgAS7O(Ah19>0q(@-)-YTp{;X^pDx(l(;{u|v4tjXH6(g{`4k)KON(WY^xF0;Ck-s7(sUoWt37k3 zHrs;F6b2=5*;!HAUC>+elfS)lXK3t|KRI|Xlgtl*Ky zN`uaSLvN&r-YNQsPJ8;SI&;F)&vo%rmTyy5&tei!8jdvsJNaA0iv?v6N=amF)DxI- zg?CVk#=S1KA!e~E0f$;>5nl^SzKMb3`aR6s4!`?6aH&`$k1eTG1me-<1%Sz6;1atqZQ z8lb;JQp1k0gC`al1s9=?!MY+$jO=-vk& zK#QIu(Q`OkwEcK93Fxe(zW>!3N=X~SEw+sV$=^@a-T`+eI>sd~crg_y_`Wh6d3`P} zX_<6kHgei=Z5|D5B!!EfOH5>#Kqa+FS_ch?|3;F9QqBOto<1s zo%PjaV|-A*y*_wSuQo@m&(71~*1`}khJ zKKOild2ruZIW*5_fTH8}2f_Ks_RoxR;^XQegL_m9l$_Ji3O z?E1IYN9Kv;>+p_$bKQJUuhwkncfIx5+c>@0ZJxFtho^VDP4%LMpSRV!mZw+Gny2T@ z-IFSQfAn~E?roe^cX!X8{O0M!aqDoW);zsF-a6d7Y@S}}TZg;H&C|;r&$u{%-$xs5 z=%;gcx^eP<6Lt_~`!C278@q5J4#oei=Ru7sNh)1Bu*>(zFUF{H^FUF7O(B_Qs*ahqJ z?nuBzb0eOqK6vNI1LIVofECz$7q$-FY>^#z$vE- z$CX5@bCQqM_*mxwZzFElSUTYE^crMNqN}!lQ-H4f$6N6G>C}|@`f*$8XBT*$=D_f} zBk;P5w35fW4P*npt2#)_hf|>K@yYb-wh<`pp zeFFG9Bc7#xE`*K&7%o>&pJFiW6HGqLNz&mLj9zT)fR`?C?w_q~=`+Z^7Lx@lQzu`d zy>F-TJ@UmL0q+5SU4%SyOFYALT9juvEs1B&edI%s%@(t#V@4xY@a6dN2|sJ$XVT3l z_026DJCK8@uD(RyM8MB+5|OW4q<`7USumeTG$np{^6wE=^heV06z?M{Cz1{fY)Mg= zQ+$TKnxH@LKhl>xS3xVn^Kn(%=pdZHgHgXgqU)H+g#mJsNw;=HUvAuxJ-Z;?bRO6l zpX^K<`E3RK$L&7C>;lY>B=ak`+mi2rdg>aU4~3ip4^V%H@cX33Y|;gjXMcqGmf6PI z4f5SN*oI4h{i+@C3&}F-(Dyjsw!cL@KHl6q+`rsq_MMFl?RL*`O!S+pNAz9?Y{l{2 zCE7S4hsf(@U>`1aPc9|iJR^P70=sz3`3Cjd8H{CZbKL{)*Z$zP;z;V}26b@AJE+ed zWn7_rdZ*^Ys*nr7!8O1~_J3L68u<(KA?n=gKv!M%ybjrEjb!U;>(R$P0PZt@ap$Po z%C)29kGHuU4fQYbM?fE-+lLPMhv@J5yWBt7J={Ln1Kf_!J~Mv|exH%v%7_y#EGJIm z%fMg0yos>M;g&ph=ubraef}NO4^f@L;iwWHNA12W?~JFM(B4MZzJjjbeLQ9OzNWccvUu*2$qnl19AEG_z){oyLnr+ePd?lfSsGV*C-A zC;2=8TW0^PukmS&|GBR+X)Y`VyOUyGu#-slb7p%En0-j(Li$AemF8BAk0bC!brh+DTczVfygl)QsYg^FuW6!FW7J)+4lx%soa+ zIj5AW-&mgJLYf=N^am!>EM`gMT&{MwUX1&R7TN6R*b!Vu;7QX}k-5k8GpBWuCUOkC za<&_>3F&;s{ME9w;4+*;i)?<`%HfxEyOkE-B=od)Cx6HBn+e+81bG>V*UTK4_jZ}@ z$6~Wvl6O^iv58W^ukd-fah~`V)#_)a_>A?WC?5Caz>$(CBY#!BI}-kCj(j9_EaB#A7{@8cd+|P)uaG7) z9M6&t;rb$oC&K*H**?H;Q_iV+6j{GHt#6L>y~~ll)mpzAx9$(e&8k*^9Cqx}_1it` z>E`OdyS;oIsaLg!&dNcxweR)LSDKbK*sbCk(tqJr^Xlg6v3A>j=$+e_{>|WW4Bs7` z*$2bhtF^n%{#~!zZVt4;rr+Aq8(RJNUfa94SMB4W+OBPIkvQM6W(3z5nOwhK8yvhojL0D z5r2HQR=vGG7~EVPTZhnRYszR- zqh9+W7<;X??`s{i(Q9or?%$h3@i)SGesg`-yRC2D-|ii(-L}`{XANy|S=Fx(MgVWK zwWr^A>Sv~Lbf4aBr>FxjL{k`)I`4 zLEnSRRc&u`tZy}eZ_ePI+x|`cqSwAW=mTEwI~V+&J00*0d`Ihx%?&YEF($`B?|&l1 z8N9z)Rri1{`@FAqbEIF@OyC6>Z@trfnAiU0xMLsnPTS4#4f0;S+Up3OlyG%e<9`!R zoI3B%ouD1?$tL{Eo|D8A7aS*Nb@+UJ(AS}Tgnx49|B&P_fUyg*2J;d;26Tn@U~U?W zp+ld@^Bqb4TKoD?-|O}Cef_?*w}1J7aKM;PX?zc|jP&l`tekQ=0$dHO5%9#CEYtEF zqTgG-w)bdtt{5x@K6`Y4{ztc0x7EX|KFsN~r`4^y z+cwMv_yOsg`riHlzSmZ-bVuK+IoPhXe>}Y1yAXIA-R`FG!ts5_KCWu^<$q_S<9opQ z%@xpY0CPiFo}Aw0VAs>HF1(if495$f4JAC#KW*g_Xwm{66W=!(f3d%v+p9;fGwvnd z<1zp`v&Gr~zqCOf;9qMGWp;OL2wYsB4LkMKQEOLs;BW1EOMhzZTlYHXOIm|Je`}wJ zdG6QJWc@+~{9JFfT=)mNiGR^Z@RPo0-FHlanecUc-DkF7@7TM!K7MNL?B3mOHG$90 zP>;fA4&R0Rekkv^^-IvzxBbrkrS*R6u4mK&dLT~5x7TMiZLr$Y_xeL^yymIc z2Z_cJdk1YoJG*CDq*Ds&+?i-#z5or(d>W+L$s8Hl@6DSP&3BE`H{RDWkgZawvZ1q9zYK#vrAI$fcIkLw3u;jU2mVcJB@^W-|z7xvLK-lS1 zAycV*0z7oi{4>pY-wwxQc;fz!+3X#*&o;Q61~~6tHB$QoU&`z3z0K*bVS}A{ z^!2O9s(Rh@ZX-5%E!7WW`{IrtDECJYBI9!hd`lwegY-7#+YMa-W)xUo*wcho)ACsS47=O@6iBUz&O@3cg&i2p12S4Rw zCFFDjGV_G76W}<3qt;HXreSP0xQN&v#P1FGlYpzSdVLE#19o?B_X%Rcr^AFCZARdh zV?K<-AYL7DKl1@TLmze^!KXB?9<9SWuy=!6zq1|Z<>0j%$k4^V7l$2&6_Zns=9x0uYZr5fOD;Pc6~7JthAgP@HN%?+Pw}k zA$SF1bfW2r?Dt1-c)5AAb(h9}n^FB(OY`N^ZEv<6D`Ky>ooL?QnsFW8gxLG+K?glR zzCt#C=j-~tAO~e(eoF2qg~wukP^h=SZ)0+@CGve*RQ}DlerEs90rt+-u6MZm7}r(Y zhJQFcnXi$COpanYF+MLwx1G>_oJH`^y(|~|fSmMooZD6HskK+Db@tDOn5PncIq-CL z?qc`2)@e(AOUxgWrJtIE#JrV#_7ucOm%iTGuJ*2K z)kyz`-u31;Fc6!%a2Yqe7=@}4fpCXJYmq;<}IIc&qQ>7(~}ClzWi}VKmIJkDtNz zjKeW7SJtQRAP#we7^E5>E8zc_J-Au99Fu`x9RZ1xpI;S!c2;zZog+ER^xW?O*;<+l z{~LW$U7A~Z?zf4yhUE%)KA++q^(X#%xZf(erC5 z{BGe|=lB+4Xu#<n6?oY<@ zu{AjsD~zM_eP&sYjkRg2gUiqQR%~q)^eE-fB)f)QwFh^@$@Us@7bLyIAJO>Ff zwE3Vt0WEgqbBPD1^!+$L2N{dC!FD#EP(}od-TjB2F>Y=q+Vb_I1mCnFj^+Iv4ieAa zF{RUb}(O_{BM+the%Es_#Ne9fH@q9pHp*O z+Ww`9zDPumN95`F_~shuuYESJdbu8d@z?gNr~@}5Im)!T>}}dC54VeJ1u1#L zgl{NvJ;}T}fA1Xo41Eir!|vJ#PX7-vo{q1xGy5v&UKM$i9{Pb`tDlgU#h!|rq;Acm zFVJk2+rc-0C%#^Pkb@iWiS|ivh_!w4naSRhjX8k$C&=^U({hjeE50TbuInfB&Rmv% zK#$5g?){by_Wl%e#AMS>;raWB+&#p6MLt&hZkTS{6Ebrwa>Xk1Nic_$qVIA2btixS zLdYLLzXyloC$vFkLf7#e0pKW-pY7Qlu-yk^F}Ki1n)BS-VCSA#UNn`ql;;9IcwoL_ zKA)kV@}A=>tI7c zubu||qEE;6H@ubQq6L1y1@K?4UfT`#B!RExgtARB3F1`1C(WY)cKil&y#ui4)@>x0 zo@u)-sUItI9ddYUHk{TqljX!56YH`(W(n4#<9ZvKq>J)|xVZ%{9f>8622_%<iIfH~)MUTo1luj|RK0 zGic*=EjqgcW?5-%JEM-1tYjJiGLy$-JAXDT>l`tOSmULyj>h;wRQuz%LEbncSN^(I zAT??<~jts=A2TQ{=u%2;af%VeF4^94I3qNcv$hRos1!q*|B#zCl1w|B8sLZKn_`czKtmy8&YMHv~8?Wf{2fBQe*ZrmX@qc&` zX;&1AGc@cA`=$b%tY#VACGcQ+(M#cDH&JuM^4W@ut~!omNi`GkqoD?6*xrdRqPJtQ z%F@zn?2GU%`G!*Q5-V6Jy~Mrdw&}75xj7aJlbYklusJIj8hv4) z4yE?+DQq6rUHkRU7)#gf9ZPV2iGN)ih9%jg4(W3oEu#3aYDe6t z#-KY6;E2_I58vcpM4raR<==|2`Nv}8N4gJSFlBP^^5p*!^*H~-5i4B-C%qSgZBnIf z(d$wOJ$zjZ_Qe2>05bM$DKZ_0YvDi({p+2iRHA%g*pbSl_%Q@TR(U@MMSmCBMSN1j z%j8|g`1r{1`%Z8HVhF%e6qeHJ38)zs&8Q-5LUl zDs3R(?_iir_LeK;F3AW^#md>p#zNf4pj&-IyF-ypVB`Xk?K{dnqYeGywHp!ou%`Eb zm{kexoQajMrKjZOaM@~zhKuk@O#r)$9n{5?=+nx-m^p}Ce;M|-&3`V*F!X4L|BCkb zuQFW*AfmozonoK=BHbIjlYv$7@>W=YT67Y>M_Hcu&xuF%sL;rd1pJ`BMm8_*%38@~ zuM6T;?qn%*S^=78pVz-60}%s1GD+DBh|epFymFUOQm4!;yjp#mUFuGHYhU$_9qDps zHaUKYBKp6f_@N?8yMMD?pp4xVAKY9QzWgN%%?)pCYnP_$k5r4P{{R3`6i0NaDZn-W zhwvW^0srJC3nbG8jR;M!sJ?XV?1bj$j+5D`qz4WlBqSI-Wg+tNLPX9Pl=UJ#lBdnJ z2J0BL;sWboK~WJC;<;(-5N~Kc#!;+zJ-^bz2=1OV?R)1A++{(abqvg8^n5;pY}mdzL2N|B%_rhFQ>>@W zM3Yd<41Wh474Oui&ucsS`x-Llx21QOFP~Px?u6ZA-9NDEwQod)$It!*v<_9{2QU1w zWd&M*Rc(0fZ(kM{qWBsnjzth<#SY?`*ppl`@MYkB4{*pv3FwABO4iflzdwiAt%9<_ z$xpbVhk$Nk6`DjmZUTI|Zh&AQzra32dsD0^=YOe4h2>L8KtwDPq=d>y>3Twk_b3EYRpY;#VQ;9kB#n3u(NIWuz=B=vA2EQRh#2r(+cx&Bw z6|sg`7Y#*4j@D?LMSHA16SU4g@o5K|Du0XC=gQ~QT(TD7Q`F#Q2q`ocXC?BO4mJ;{H<}oPosoelC@Zy5STJ9nKU^Lue63cyjh@%Ta(VKwZLLS^Ggk-4)aS4f zgNI2}YkrPAf?9+!p(%HfOto;?J5z=;VM^eH)|`L`pKmUyK%x;QxiO?D$ro$?Vg8cf{ERx3rhcz!jJ`!pN z4a6OqXio7bVMrbX262W9%!Z{?$I8b|d8 z|J>4J0D=|kV`V3K)jn395`UI}kXxc^M4A=+(76HiN&gWh3+N(*k>LU0TTawBkyEw{ zsr;n`6tE@qPqTTx3iQe>v3=a$IV=Xw{UyV5!12Eh`>S($|W2U+2lYbH){O@4%wbEQ) zf*AC(z}qkCTTmbvVCbDL&YCb_4eyb;8uDhCj@aMz>!bDP3FN@`@=2QJ`U8Mff4I?E zYoFEI)t~WW$9M=6ni-D{o00wmi=~@SHp7YWXwoGx=D>EB!5@x4wRh~>~64S%#5{XsyY4gmM5KQ&=uqpkqwh)0Z}8@K)Y@ib>$4KYZ0i9O zR2mcJ=8a-+#LtV(^X4rPAo8l^cI_Q}318TpUNNKoJK4#fbsy}*y3QA2xWXVYo0fpymp$7{m>*b*a#n19)kfl80V1w6vHi~>;i-LE|mC|R)X zek3ZD(n7kgdcE4)%KCXH~GS}MJ407 zD1YC^$M`P`|B^8&wnh5^EAq?IqADJu+1B(e`Fq1iSJBEe%PKyw#H2)zSK{%}ENaFG zltIna9}D>X-weI)duC^YWa495ha`xi&v+WWK`Z@WJM~=PZEr!9VD>`bTo`99{VsmI z8X85&kg&G9s!EzgRv6n!_m{C}8of{)lz$R(mHeB**bPad`5LC!>7KHMr&T5;QytK z|6+S3CZxTj_KpxoE!QQqsBg2)aME9l#gz1xps_pFXduZ$2*sIjtB}Q1<&8pE?{7ED zIjY#GE|I%ryG9|rFITD9WW!HjxqoAP%4&G%!o3!wC~AU@VE+j|Np?_^U2cdshDLAf z-MkCy0>Jy?#p!6G8nxfr1ttvwdR$(Vxg5PJ@MHZZhy(fE2(A0e?Rdg08_H-C5C|oQ zq6xo?P1!9Zce?&%+Xtn4iUB<+OAbba4Q?NRNaqeb8}?C2!fzH6P^C69)_+48hVYO3 z=j8Vx0U$mEn($cz=Iyyao7vGd2!?%B5PeVaIly9W3ddwN95!^ee!BeZivz>u7)?SL z_i%W{B<4j>I0#37#z^X-7YrC*3&}vRDLOcQ;&h;E z@*PSJe;vBB|45`ier8rYw11}o7}4dkVW{uo!d^)!_El6MmgmtXWJgW<_IlkC9|{qV z@hFV`m2VYLpiTP#}p=jxcxL|C(dYZ|;NzOK+?=9_0>`KV>f{uVU)5U7L`FvtU zh-A7Qju{99<1P6uBTXTv2a)d5=~^^Yf#=^5L-!lvcXRSI8s#~s1b=QLTVJmmfNu*a zbIMy}p=aGyt=H&nG_ci2Nmn#`qwJB`wu_644P!uld@X_{K(mAJ2n8h`z8wZ;2m8;o}(Uoe^*HvRQX>i7;`;pB6ECj;GJ{5j4mc35to zVoyjA*xycR%(QOoZa$hXpAIa-b&el?7G0xR;mt)d9oyx;wcf`58oQS9`mfy7k}Erlh8WtP zV?c8Zm{_bb&40e73s!8EVR))7STn_C=qYtB-llUCkt41j2iD*9= zv9KIm#$Gk6mZP@ZkZz@()w>&2t5}ZZbu%R-J`{txorSk(alxZf+f2aj(f@86GM<=erX6sbr>e%#zIEgu`P5R9{^ z-%8(Act9?FWMb^#V4JHxTxl_&Q&~4t>wmKdGj{qYB<3mt8v8R^K6BvueSI+-=@wsO z893>Gbta|%ng2rae?9)V>|fFOzmn;6;xZA)|CLVsJO9@o^6wQYNEB`M>dT+Vo^(Nc zPhPYok_KJr)lWZ-*5vhl^)B|SFxR477W)m3g7@!Zo3#hr=CeCpBV+p$J3AP6{eKCa z^*;fc{ghDBYQ3^0`+5ak(T5Lfwe7>&f3xauCh9x2t&<{`&!i<*2#AlwbsU`C7Jq;sGMioI1XsEBVuh!<&cog?J6^;h-{-=)8H@E-3!} zjr!uPNcE*W`@8nzm6B}i)ju%Z7=Qks_VmlCF0|BStdm5Xy3ya9>_|yv#=A+dZq(<% zzu#(Wga#bzF0{x0^qORut) zS2=o>qZRmXl=&+U)!A!pY3~0s^0HYIv1$GvCAa}N0+$r!BeV-&$b@aMcz>odeNjIl z5lsJL?PqI)Z(h??6Sj=k+P9>e>fb6!+mINv_5>QWwanHAZ5N|G3)^|~R{IE3vgsem zoNa73wZ<~dk!UN@wFR3plepg4PsRq##jRWat&wLfq>Yj?%ovoluw_oO^%P8=7F+^L zQMNX}Q*x%U-CHhS2l_Viqkq|FpeI1HtwyFPgO@6gxKKEb8k#c(DljqzYB($+QZ&3( zJ6KyfV3?`)GJS}>LBaxJ6EFXK1)$&`zE<1PQjqo#|LDruYw|J5=Ki983n#6eIaOTi zT1#^nx>SYW%*7f#oV`~1?%bt{)}braS%P(~dUnRpwFa^}`fD|MIDdPs^xe5@6|F

&J*Dwzx~I#fWv8jj=hfkg&%2ufxmH_D}1EyOE_>< zj&B96nu0SFv_{%aAAhvk*JmRTLE}s~EMlU0=pxk<%DPA;Z)oTm^-QDw64h`2IV;2= zB37rIsn*45IZQ*BXJ$V27pQ-4UE-hF>2)z(E144Cp1Xal|A_TzVt{ppYL?B=1sW+l z{q<>I2bLE&SCtvC9@s6USnxyqhu7}(gIG~SKA&i+DI2F6D}M*P-qZ)f7wtJW+Xov5 zwyCrrPapz8;WvQ|v+oCwe>=4)7d&y6kT$6^Ge4@O8x0|Z4bIn)6hR1;bkx(yjOsIv zn8#xnnLQtGX*PyW)0Ief1M)pyEnvPR;Z}GvdU(L}qPvlIpy(SE+R+9u5q7`+T8o!@ zdl74oV*CDrlz$Mqs|S6%BavioKsOThPyH2Z@-$jw7Tv{|PZPW6!Q=ETIUC*!wd6&a zV1sbf5trw4ea#}aU%v~y%QF9{j{w092%FAT*hIfXuR}HVhN)Z(rP$O_(!Mt3Y&LOU z3p!)AG-&9Qxw-ZSCbs<}Guf(;^H8*9`naMZqQdT67VI*?|G`2C}XWc@Wd4sM`rAFgb>BR1}IhF~+> zZ5VjD5P!r#qc2*#Nz$8S@J))|q%0U2F~6&**^339kt^6-;n{op&slQhjISaWMAp@a z1j3rRHKLtZr8U!V*tsT`hbI^wZLdxKL;oK!F1wZopVF-ke+H51i%<0_KE4vIm?=0a z&9ZMBj%uYEi=%rZ>+$eJR%OaEEOILcWgm9&oqr&#WLQqb-=ZSTv}7X>FFdz?!_q9P zjE6=x(l%RWkVs-eVt5zzG3!0}ZCw54<;k2?;3Ut6PGF_~&iNdX^I3(lk@-0YZ)Az$ z^>P-w`ah;jGTM~HaBrZ4Km*Ax1jb(=IH4~^Wn&wss&Lw72Jk&F$xjxQ%R+xwHmVc^ z8-JdxI^3m#UcFc%H698_9ypiNS zP{pqionQ4|$(uTB5KkGF3wM||T8v>-cz^$YVhNFGOw7NpYD;Wqj5OjQYQ3Hd92lu- zu`v^le_u~)TTjmcK|=52*}|ZW4Cmi77bE?-jjk~qS(8d5Q=SKwp<{Ny5EhjUJ!C;j zkG7tIY0yLZF)2km7Zm(Pc1sRhAuFvVMrb+JZ6m#=YG-Ra%1obF-9TeYd0={+b^n{)K}w}l;FS$MSI-qFe7iLPuZ;?Gyp zr|dcW=l_kdFTce8@|S7A#L8n$&{&3&zfD--8R3oNkL&jI>G@U*TA4kOy}35DVUUhP zhL^YByGrQjVzpgQ-h`~oYCX4thJQ;I7wCe5|0y5xJd-`6UP}gZ{jnyo>$kucE~TpMTwNKL@9w zjc}z6_~nnRVh~lfz*>(Wz;5LmSjJc{Xz-idNxwuv2z!@bUhs{_3w@egW~pXyva{IL z6`NEL{^p9WOc;dN>dz>9aLVz(u;O!!)SB0&Sbr|uGa#o6-1+lspZYb)GOUEc%SH|9 z#&ClySORbQS_f6+prf#@{(W_f^9_Q15=Y|1Zxr4PHfEQcJ-gX!dqhrzr}`= zsps-{56k6m=u=x?{rx|GRh??s?ZxAAx_I;Y-Rrl%{ljw9M{Ubh)TVv$qjCTB^$#q- zlkW`b;RO*`A%x&(Ap`8-pOesmMhX}P*JjvvdNj`4lOTd73r;y#1Yq99%y0f-lTm^m ze|P`+D>nG;&p)d(R?9bp*>+#FN?SDo|CPM%t&PUwB-vQ9@PXCGE8lX<5#P5ruX)6t zJyKF#i|oO^p6F@`ChXPa0FVM`qE2^*$@m0%ay>n=Dh7J()e~t7K5p+51ON_<-VNMOY^o?gU<3d2kYr4A5 z^7Ib*d>FUrKOwSs{l$3OACJ~@1W{N*gh!}G7&rjfH6eMooco_J;XMa1s>;4mms9$Qin{DuCMQq=3uSOE;}5mmr29lBEe!pUD2Aau<<&6sXH*U&_)Ia)@TXJ|Lw~k3K|>`m zv`3gvUw@z!#V}ti1ADBN#V}q3f1Ao{@!E5$jG;Xer7`q}SQ|rs!ir;Pk7RWW{i!IA zVLX-fG4$uWK!)~ESf5sidikdimrm}NgA!At7ibm7mP>ye<8S#>Pt|6 zQ^gGVTk;~4by!%0&mOd2p7M+8V<X)K2hJ2t+_WfARts?6=}zuwcWL z4M!B~(TSQALAjD&h_~82e}bJ|S;zSD&nj{8-?F9!x$4x)77A3!n<=ysa%PGg0&g$} z0$G}V`pKO>p$_m4qjmhry?z^Xb+XRnwY<=Hwtsr@42$*J&yT>GoV7k>CCt9hMt&W# zs2^6Bg9UHMk{q_hXx)ZP=YIfEK(4<~p^gAfPWo$1$U&_xC=c~5JbUw+=6|YcY}oc< zyTWUi@OlaAFs4q%72=!MK^$ctxYIFOz(9U}er>S;*~s|HM%-V1bY+nfr9@7-25{&q zOSaElZ=@i|HWp*QI@Xms@|TmvMP5)%BvPGuV5+K-+2z7kAmoDC88xT8tV0rFh=9&D z%d1+2BxEKb@jNFMdUXO46o2x5MoADY^!<$XVijf$5nAvW9dKJg0U`C<+jE9g;?B=$ zt;V09*Si*nZmFB0Sj7WxuWWS}URECCS0Q$p^)7-)cBx?_GVeeo3v0+opp~Npy#5xp zKyz_oVYwxyGTn?K7AC~=U}+AU`HvsF!u+S(|JW^Pqeh8!k-QfdHh))jgTK6fN3d_S zLd!FJ#PfB!9L;>B1}nxUKN&BPTAfYGpytZe~2vWIC-PNeJmGEyBNzzNu{tW9j9* z8{gKdD$@3Lsw&DEz<&}=gWGK1kt_R7efeX`t$c5Nl^`DJ9{NDRlK|xO_OYv&ElNRa ztw$h4gcw9sWQm-Z%IRJTl9S^^(EZt9zxtkPF+ZX%$?qscqSqh^R3EXK)}qF_ikgMF z*zYe~@{&p=!P+B!&5;1!Tk4vat_l2y?mD>@n6pLBFX**15`SjoSvEPOk~OR0p-xcl zDt8|%%MLpBRMEgFlwx`o$u9D;d9vtAOjo&DEs>wO7qOC`3QzXKqRht24dwnQH}0!E z{S+p049PEKow==ai@6T=@WNU^<)5^==_2;ZI^L_uh12XK;_fLL;VMQedU?ec9Th38 zfM3=^K%`!PhJUYKKKd&%N$k*&2%pHPhnK=a&i(I+e|#4iA^yF1_Ba^PmmKaT6X(u{ z@FGD5(uVSt@8uiv#?&iIudmFdQI2|6;)_-pHXqAE)u8W4R(o}V7yDxG4=O~Y)E}}b zeE<2YX!sjj{(t^TZIyUKOSs{gv%5NT8DIWg%HY3eDMy3vsa-&}5KGfAW!&1YEkf_y zd0d@4V?k_TWeqHK3j%Twe-4B4zk>4)c7GKdQhHczbC!s3&P>%Qk|!Je#tJ-tSG9#d zwv(%f8v_2slgNlABX6kS)Rg6WqI?YOYf-6&U5>A?j^DhNlMsm_ z90_wLyowcSRpOh#M@Deqte3>SIBrp92%ebjPm@lGFA)>_=E(z&jRP-6BPwRJUHx^F zj)^1?w-o8SdK&Fu37AeU_J12MlfsEAe?bY4$RomHuC>?qcu6mc9YdYql{R0bl>dm4 zo47)yuUhrHD|9-3R*G!B#}uhw(Chc%^4;iAPWC$GW51o*mL8YKyIgtRZ$EqR_q3bL zY=*_>Rkxjf>^0KA3_&n1Evh@WQ-16@<=r4vo8C`LQ~2gMNI8dY(m9qMSA){Lf4UoV zvg>}kulTQ3Li(zVA;w$`eCs7?1t{H8jiZ>sUqdekas zYaNfiNv(2sMehdQt!hX1%`dgXfBuQaso*!a{aIz*gz=k==Wp=)+g;v;cEfcOzHc6$ z@!OlbVgkqA)TaD*z6x#V`)XW%Ux(jy@qI52^KdHb8qVYJT!424{@uC-?OTmNUxiV= zvTne;cH_BMYk6H(7TU&u&!+G?xvTA-yQls{}H~sY3H6de|7kN&??cm z%}p8ByahNt)$@g{L+i;h*d)8k+*X~t0`%+5)^!|f`n*FJ!I*c@zJFKD;QD)a1(;8# z$6#A;)x=yK%Ut1E!C`YvKEu8has*p{uC3hjGmg=ebAq;s>-7-#uk}gHANQ;);09~^ z3Tt3}GdMflb)UhxwQfLrRcHFl_SRv0;T;H1oc#T9{Snr6TPGYS-Q^S6T02ksz+hCs zw(yNpzAHG`-$!^?s863C;ayYgDUQ+LIB}mSWV_8m?ygY9eWv!g=LH-8@O+E7aaWT) zj4n94Jix9sL-=It4S#;UMkaTc&mcV6{9tTNNSp>byvqY@ zS}kQggik z`k*~-Zh(hX;PiN|lX#6l9Fg#pV2f+%HnCsUp2HpckLz$z+QZuU*}?GQW0Ta4O#*hG zlOv9i0Z)^)j&*+_JaI#^I_$5#PaFPY`y}8$-+OxJ%Ot2{&@+wBbr}F<7m&MzT%*lv zLh>%nANQf3mwUuup`9_u4eALuqnVWL*&ObZF36MBawJcPE3%}qCn}HV&uR<@n>nk@ zB6aN+*R@aWk&uxzS)Fvz8)M&8I$-k?<49e`BB$XTIGlf>@9J07C+}OUJe+$u&^^AA z{_Y6bnd$rW>HbiMbyQ|u_PY}AuJ7|b)K!YyW>Dn1=QFn%9AN*5|1ur6%V-5?F@f-K zVV(`XcZ^2aSyXKa9SZlgkrQ(#8D81HnTA)S1Kl#&HL3D}>b=zYVV@c}FDDD@%z{3j zxe>ZG&1-)jXZDRen^$(k<(3BN*LPBnQ*=j?7qU5~$KqV#Qtwyy>Bh~g@Ftr;BVSt& z;!d_6CwoNwhUv`(Q*UPaRL9AYem}XnKW>0GIk)V0d~BSR3CZ7Z|2h6~8YLXoWqslq z9IrV(a$Kixx$fZeykWj%=)+pS8m`g#SrYP}X7hhh_Gqr*G{B)ra40i4kc~j}U-i#9 z;4#J=LiBo+NBF$B?yk*Wlj$^?ramw9Lsk%Wq6-I_;xjJgChDV6W=5{!@YM1#_@VXg9)2+Gk5wK z;=O;P@x%DKng?8N)^ifRaaHE>$L=w0(kdOflcsr2Ktj_keD%QLw}eb4%KE;+B7@b%%GvT*Lwxz3s}K8p+6a<6w+bZ>-QUvE!xijCLj0|vZQ7sB-}9VPpa&vpGjqjmrPgFWVhhlh#wyU z_ASjW=j%VcsjiDCeM}?IO^ZH5e4r-e!WY1!8m}F+`F=z@|9w1@ZN!I+*ZZ;>&2zx) zu!$VOrJOVDe*T(-z0z{dqAse-H~gF@Ucu!0Ue0=EYd#=d&(m;+)0}44u*iQ%*V;4n zjB6P(zhdibi#2QgF*z=Hb_{1#Iy*Xr8Ehi_Lkrbkr#??4A~^DXlCwKKUezU8!^0e3xw z{fc;b^%r>mjO~VWW*5*#k9&Vq6LU22+Huw@ZH#8lt!f)}?DhavCp7TM-z)To*lYws z&y#11%|@;Imkb}HLMLm3PDCFI0b>Ohnq=QE75!d7HWxwgD7NG(`ft3eM_O|hiZ#H z__pZqJ=EfJbbC+G*1_!tz71Wojc}RMHn$*t+0G?n{NOpP`&!NOD`3~>eC(J1KD4Ca zo6cL~0UvA7cb{C{{65+U#37Izama+|HkR|l=s(OKt=OnJTta*wiasoDVeRw{w}pZJ zY3iJ$KMC6_gC&3Mb2ikro~#+?DqELfqf_Mhqlotk*bo}f{s?XACZA`zOjGKA+&|*` z{RTnXJ&ntKyt*xs>$U+OLHQ;CE41wwGtkBpHgC}1Hn4y0EwkOn$HF#G@hq&LNsile z$kx*K2(Q{JEiTH*DSq9KOL9#on>XlA@ll=Q|IlKrg7$xFf_>7It#ltQ#WImx(Yvw7 zozOZof4W^?ka}8sR$Et~O}k~_oNoWwi*uXS+*N%SC7bU;=L!2g%90hdoyW=kX!B`s z*h+s&i_0D_8;jz)MlG^Ux&Ha5(WFgBC*N17zokHQ+C#mzP-{Dezs2{934KQ66NvM| ze!ya&X#aooI19_#gv>uxX=0VP(!|X~(!?NMmUPNxapGl^A71!jalRJ6`f;gZQN#n&*l^810R3FZ|IZlp%a(ByaS`3SxL?r;ZxSI;KhMx^0~=0ga?oK};* z93|)f6=gY)G0Ubbr@*nL#Id8_NuxK;m$g{s2AA;^zVc0tpF?|tEv_gi>sjPtr%ZM) zr(mA9B#$8eqCbvIh3qU~)yYI)e0a<;XzaY-K@Vn1(R)Hb;QRsXn`Iz~$rB0KD{rBTVT6LJ5LQd zE4BVOAD}b!?DbN7MNmeHt7m`o>_@Ek`}$+FNbykT?+1^Yw8SZKStIC6i-s+eeVW`S zWx^flkJi;T=0W$g#Cdo2o z{gDh{_?b@9!uO5E&Q>0$d;VD8wZ~RCRY5Ldx_%n(yWT@z_xY76lWl+4y+p3B4`(G+ zCsyMT3oY$jQ{!=*ns&Y`@@(B1i!(papCf$%f&SX!>Fzm~*)=^jg#UlR`)a+Sic`V3M332B zxI7|!uR+~Hznf;)nPe;?+A>^j%a{p2Tb<-mEe=83XB97uHJbZZ7|l%Eq}GQxgMzVx z$(7yrq<^pBggwqh+9$S1Pko>d(1(0~o}$k+1Wl5SOUN=lJthnvk+?$|?jz#yqg7K+ zw%Fwh_sApQyDER#%o2G`Kb5}5{UyTep5M2@xM3FGNBd6tZZn%Bzhzt`8D#C>qC9d=GmS|dnA{+V2_=-i1T(?oHw(l6}W#)MR$+ldq4KTsV_tf_ki0n z(6&^WiFuH({qClW-)|UQI@N9cX2WD;4k|3eq5Q0HivMZmOO(T?ptznKX28TH^o_!uOVmf zPCqVO@n3&(8#L#?W?Z-)*Cyge9Y3~^#~Mj~uf~R%aiMZ8^$45060iJ=8P~{T`2uIt zUEI(G$dANhHVvDi#h%09#o|dcKQ^}S7%`i__`HYg)P77P@h6#si18-x<^*q=aU0R2 z;7x*lhDa+NKDYLBp7`WY%S|$Bm8>>q?fg{6$C!UI|=X*}54&;NP7@IIJm- zYSZI#l_&U%z-wikNniC*wpTevi~sfSB&hKbmb?6AkTEG=6UVb*$X(Siyy)w`;i@7N ziaWtJf2kU;X79)F=~HZg@K1Ol@o!=BiGPRI_X$4dI9@zSpJ0g0*>BYm{&^M~do1KB zMkaqlF)_&3n6HfT3GkSVEZQMSRwe%0%PDkAzGTE7mItaw=kHwg&615xzmw9;n|?%1 zo_ORunagwz#g|fid%-vpS7gaB^N%2?<@)KC( z5-nCn%~9jat$m-?&_Dj9uZ71MHQhpBFIj)A)25)sI$7s1!8u&g99)bg;(mC#zsAQ# zS%k&#)E9s^6bHWHv6yAUUJPyBwUn*7OvU8^H3ovkMT|mxd?F?X_hjVniQ?Dr$Sx?( zaGeLM@?^)%AEekFEV+W1pE@E}Py%zHZR$DQ7o+&XWiFHxc}JF97pSQGzuA!a<GiA^Ak$ZOQ6%mH@>F?gNc*DpQ6WTr;zb>QkYlCxr`u%gQ>>4*V z{PN@6j9f_Cp8N4G+?T1G?G&>#xiNoqN^Ni47UQ)AtDia~w;|$>I~yB0By@exjXP4` zYsxq$7H66r#zjm)B@nOE(s`-HzwhRa*b36SIseknnDb(uNiGkGxx00Xf;acMU4!lt z;<;h)=vxQ-OK=@+DP=@oRuZ|tG`T|DDY4iNl$cR9#$&&)&qR!e=ij>%I)s1l4@-Z4 z#)n^<#{qEowQ}0sMyA`=)iJqFSLgO@E(hL7zCmj{@;lJ=yCTcOxuSEb`U~h?b&G9F z!(nB;ON;#=RJLKbF7C#J#6GEfmdDmg`7+|3KpVSDbVIz@%&T46D^H<+`M z>Gyifk4L;XFY@8wI%s^*bATRiEaQ`(sV(o3%h(~3CwyCn(@@}&;`x7Leg5R8!7w_T0Cis^sVpp)GV7q#)%X?8L^ zz;_4vE&Oe5v+u$@O2yt`kc^MZsqDlpju-a{1#Y?JxZA0W2dT=qhcIhgFW_%$n{KL{ z9^Te>vcF{YFzRIE17qwFjEnQ?cdD!2Vm4ORm;hL;%SYI&xwjb>GY2=9{a7lp{K~sw z(u-r><~!Vb9Q&7MTN^i}$?k0=^AXwQ+ahYdlx|^fJI-o2Z!OEo z)v@26ZMwSR!?Y^d#U zg|LP`9tX+v5#Vv?wF|TQ+*?yWS%7t71>em_jS1{?T6xdL23R_m9F`v9ekosA4+{14 zu;?7?ZNSk+7TR5o5oennkI{z%_~?QTBc8Y0nZ$4g^wv%gZsOQC`F$lPakkY5x@&Z* zx5K$Jae;pZ9vn7rZ*)s*@6lLD1FON@W#cGxnJwJ_&cyQzpMFZ?Z?Gq|=}^w2c7Snn z?oBx%`oG+LovyHtUrL4gvX6L}e4Y#eU;Ax<*{w6{!L#9Q8ED5jxVN)$Z=N}niU5OL zHV*jd0UaFOPL|=8xxIPj-BGfE8SK-_qKoT4HuQMoAmIzB*0+RD;DBNqlo`* zaWVn;#{0$A*d^GFhe;=10+^JFnR)59zU(!!2n!GBAMl69hIwr9?>@}WJ!E~*l& zeztIJK&KgX{~ia$!V%`19TcBieD1Wz42IXp2d9H%W(_#7^`9fXc}bvk7!U9~`Rwmu zu{VDi!1@Ts2*y1&Z`RHO8ma+p?ty;dqsDmU?-%_K_B!r%%3E9?z<%4EXLf@E_UW)b zS-aZ=qapemV43sh*z)&f$>H|FANw*eUccQPf4yb6yX#FSNm|EjTx!M!}+C{x0pvee7@OZ zuTztAvhI@@I{@qKsyDq}y0_lG*Urqp-V#21ZCp>jHSwGg-wgx%OE9S~VP8@u;2l5{ zg(2|f;dHzh%rk(Oc{wNR9(me4;>eTk76L{z59Bj^4f1==OW5CchfibVP2IV3u+tDf z*FAr~zsk+VAG_!xj&J$7^CJ2Y<2n)ZBfcW$pzJ$`^ZiteU3w|~i0>9(l`}zuC-JFm zuQMFiJ7pNV1ZQ7*2kV{4IZf%zQohUR`($0~IrK9__}llS4m9K_e2w8w9^U~yC_FN| zK)fd2t8*ihp$xLQOXhdg$J+7!rj)un4v*F2EK#-4UNc$#rH8WU0@qmIF>i}&gHoNY81!q)^=IO-06BigPKa_IA@z(?2*T(e|{$_J&#uugBdK}~tXVQQ4 z+}Q8ih%+bm31rgM5#%Q;--WY&H}E9w$n^t0etc*K=o)0SjCO8)g*_c`c%PzgZLIL~ zF))UIHfE;%x%21-d3-d_O^WZnhvycy{UPTS5#wuTqbHr7Y6?$4lI*gNvfS&!Sv zjW+_Ai*uj@e>XWVL0LXz->`p;7sG#Ee=HR?Prc5}Kg$yF55C@(&79=d{@fyXL1Hp2 zSo!qH@dLD1^ya19gvpMBWLMzDs+7xTP+kyt_?_|(!03AMwW+W9!LiXFuIc>qvSgc?dLdbu8?K( zY@}DicmZHtNGp8q<@?jVTe0{#|9{avw*d0^(?UMp*@)W?eMjE=a1{)8spxvo+^9YPR%l|esI=CEHn%4)N@5MEF(zGWFJ8#3Qe&g_yYjTR2d)g1@hVP@w&uL!L ze#LCcS>-I0bCPGNu<=MdUH(Fo@v0XvM<%}kehhIwNoR)pJWP5shHJ^^HN#0f>ko{N z|8keG?K9WIfIfPQYI!gNeX{tBlQ^qa0Z)^Vt3!YI^(gc>=g4$yC;oe3oH6`Qf~Ph> zh6P+tcn-?!tt#;3>J!PYq4?`CnqhntZDQ!}$|f1@&Amq>6~GL+@Bp z_{x7C^|eLi_(|9n1AEKfH!aT|EzgctS#R&Q%OFQo#;`V!4>L0d{iON2*P9p6$LaN= z=Z(6+;f}#)c=&eobqW3qahBOpkq44q%GRabbrJNWEid3LnhzoeYLA^C#)%2Qd! z8v&2AOve;^nPcmDPdetz3SXO?Vd1ON4_}kftQUV@{rNLL>;QfIjcfo{!emXK#zOl! z_&TKRJUzRgBkpy;799yA6{qxd*8tA2HjpE0N?&qp@?BHx1MsVf#97pddd18Z3m7on(7F!-7PdKs%GnibUxBmotJ|p}&P+fy zJeCUkskROWXe6_8a=#PhrgCsGWXP&UL`|`f7+Waq&3~XI2XEf90`{|7G$T^wCbMumL@; zx9bCLgHD+2cgk_MU0D15v6zn)%6F*uA?$h-3+DN;HqNjFvI;sHO^SG%pu&O1WsdVH2n+B(e(*;;_7m4|VGe|x9n1KhcH0N78EHu*Qtl@K0A zaXf5az2VF|zR1S7Fy~%lJU7B;>90qPMY$b+@Z$mkd@XdW(FwlH_!F$9(W%n8bNI2a z3$~qXRla|YZH>jG-IPLoVodhQB~rlq(YCyo_I!07#fhi;A2gc<@IH)*EJ(dn#48eQ zCw9Fef9OfvHrh<~TK$li1R?VW@q)unpT`M*E`tH|=OlZfW1q2K`k1HSNOIq;k9*pD ze0k3QTlZ0EvXdg0Zj{);4ZsL}Ad^8Z!EN2ckM?ylS@avu>1A~1%dlsyUD*?MwlKR= z8RXwyVle0Sq(E$626^Y@WkR~Q_cZ+(|nLBp)N8Rbh2x-ZTCTMEEUoAo?rMj ze?zogqh8o!x{R>LAkNju9uBfx0c9tYt;nYhIt}nqwl``FE%5ejFNJgSj-?xrdmA$~ zo^@i_FZOC&B%|GY{tQ1_-p>0|W%O%i&xxnw`#uTZ=TLpAEo9FomwQ{q=gFw;0`52% z6a3LU^FZ!AAg^zwoK20MExXA~0`ELTf1I&visN)P(uS?fpT$DwCag`L+ZRhk;O{t3 zn1_3_9)CS-!t92AOnRr97~Ha$sR+Hz;b-+^WtZ8ceOL7NJ8ipC$J%$%p8;~vpn!H+ zl6k)ZuA&_>YJbVDim~D{rjTsl&F31w!{B`ruz$S#i>go38LZl8XN0SuTa<40e`CIP zA3;xj>WBGEL8iJ}WD~>WcxlsN1s=fnC*!ij9R`5g5%pNa2caKJ8NQJQIPI4#Hqi9* zN_cbMRSxeOfZT>U!tEGzsM(5S{xQbDBKIPXCwMx7F5%%XF7p6yiV zjCJH)LT}x}o^YG<$@@C~dYLX&i;_p4ecQOU?j`vcBhJd4n}T_-d%59xI$SZc9<>wj zEDN|%Rqv`CyB&}FG$(U;Ck*81MyrSNAKnp4N1Q)!E&{#e>K}U&F0(Dje`KK3d|H0( zB*u2%xb!))m=ea9ikTF^H!&ppLA-}{AHd~qhsE;&eWI_#*>=(1k;FL8GTvuFyEfYU z*tsrZ2C)x3*ZCMLcGh#7F5oEogy-Eh`ZA;ZlN^U`X10>~b1=Lod2KjSXMLczl=`yTc19P>x-?ePzwOD922 zYN>OYKtGosPTV^?DaV1Vv_;=L+SGxUX5cKue!trfUWfC&q3j(S-;WB~AR0U_#|Zat&C78)4tfdtPen`t-nT3I;F*?lPt3s@+ko@|XWKQmZ(YYLdMta!#ILZu#Tca?#i(T6 zw#)dcW_u`>>5kgW1)2wW5_Ne6&N_T%D^({7gNv0n@fiLlJ8u(spDY15k{+a(J#~h* ziT)vP^|>khE6eN{f9N~%?X@%R8##*mqp*jhPtjZx=+Cy?iBscpd|yUE_OJLf66rd- zPgUpla1~#bX_L+)uXHZE>>O*6|G&ZFOj$f2$Vxn}#@F@i_SN)m0Qw-DhiErQ()|yz zCp#Dy#_uWfJ=_hFd*%L{FF#-$KGWIf&a>P0V2^9ur|igce_!=eV+^P2%WWqTwszYQ z#yw(etrG$VZkuQJdFg}QTm9#9zh=HK73UBV`^w|gBI5*ZIn9ZC(=Ul{L0wba!9tyr z;>AGMZFamO=w3(H#}R>FA8qR*eUk2Yi+Ea~E%qDM5xD;yaqiFAxH*75@8>-K2>+gZ z37&F4lHXg-98Sg17d$2g@U0m`h<&Z@=93+_Pk&8$ zAIS~g$5P~mOaQm=ThNqn?&>*&Q$7B^Zm~^^z3pJv_|TDA&8}9!b4Bx*adO zjs3Vg-H-34ms{S?uAeN}WnQ1Z;D7hULGshGlNuXqoSkFuIzdlW2}87PDRGMrBPEWE z{eE1IS#FA=Gl`&`NIhG%fuNo*)DD}8rz-OFx}T-cOqR+wIeBOVfU8By_zupHH_P0_i*CkPNm(as@(OO z4HBpOw%nOson+HlOC)=@I(cF{JaL5oWtySE7gwMPUv?b4V~zENW2Kw<@M&? zC6kTC-`q~fbJ}3+Q37NBlz;py|8XUBHk*N{7q4==212s^9y zc!#3j8KYlG{2k&8*UygHEyisYK;I*oyTtv9BA-gH{p|6WUW}J#@A%zXx-W$HG?X=e z6){$%TaLS8FN)bQ*#LUzGnkc_UsPQ;p4C|v>;6?ccl^EKzT2bl%YT=O4!66azKi*^ zFjmal0zD*X3~$TlG2!=%BhNFrPmKxbpEoLRyoR%p>+Oq*&y&54`?aa;hsj`KY+PoTp^yH91b!riuvcy zlSPCLb9|Spe`Mcv;*+l3XQa#S`Ip3_McwkMv ze8J*6_*LK!5c5n4N=5f2)4dNgdJ(BIs#F>tE zU!3kw3*5Y)UN78a<}fJM7Igp4l55A`hX?3`tpoI9jJ20^8?^^vcz|*@^4L={rP`j| zp~L;0S3O}PVSjTA-c@AzQA!=c+fGvXE-b$d>Uv&gg}l7mPCqJnh2%QF=G+;a0~7S8 zpUN3#(vCWZb7c8Y`gtMTh9=xlcZM^e#c^pE%;#l?1^X_VpZI(M3$^J#pFdhYc zYzG#X#Kr*JS`Jch{^huyLgz4^{YU2WK>4Fnq5HgohJSMGE?yk(k6;|j0PTS(I1`f2 z@k|~<^oVyWr+)4z@?|?MknxzziZUbRWRP=2nMuZA_B$)I^$DKMd|mR4WA}O|arZWR zyobMg?aM95T~B??vr+UWAX6WDhfJ#9-mLE8&ntl2!ywsvXv_=Au9JD{bv*Q4&xTf? zE4u>?`hQ3j&TzC%y1U_Ai#7ITfp!_s&tst25fN7{~P) zcosw4{L{c3N)Xv{qEUgA7rz0+L63+#+oVi=A1bKjnsk89Pf zEsxDOV-EG*8U1;fH}b4@AVZ$hPWb80Xgf!Hw|^d|Z-+a`qUf(WW6ix4+OP*kENn>I z^&nX|2j+8AZw#>of&BgHjCS7qj4_qCjk91Wa?_qOzC1H9_tZJ<&*2@aUFD4V0_;KV zJ>5>^V>n};$nQ_j6Yv;x;?wQ$u3tY{Se%2OzP;hBwty$7Q#!LV)-S$0y?&`PoG}NA z6MsIVPjSwk(I=BdtMT6A`ka0fs4JYY{v({P@osW_PM>MOX|&~R=?p(TXR=S6)eiG{ zoiPWpC7snLoZskYLV4&6IG`Qk9J+#bXYjt;-mc$1Xa9R351<_Me9qVy148+%b1skL zv-;zNeV{gC`f%DV^91_`o<(yGlXKV{Q-9XE;XPeX;C$HkES5E*4~mIqdwWtQ3Xuz# ztQRo`%EK7ejXN`c|;!|PwXS+;6NYU$oE1H3weLZeESh_p!529J&IZb*>A(v zz~Ve2-Y*8l%(NT1PA>{Z+Ibmv?nQmiY21Fs6bqZ~ygrHeev3K_=z)_#1RT*<7JtzP zvr~tCJM?8*`}=ue6}iv)c@oCM(h>9H{2=0c^mj+Bf7JH8LDAo%NMBBYa_mL<<<(d! zHOHQ>x2rxJvc1#*k6C^b&{vh5b!slVQ$GHjs3TA>I(v*Kfd4(JF`3-{7UgG`wFpkd z6tmc2kb^-EPYgltM!O}(lK0!aw14mwP+oj?S1JL09+|CbN`3>1O-k>2l*=6BcPGO+ z%h@#roH=kiby(ameCMEDW!uBt4SB$W1;BAJ3y;xbF$Q%O?*lab2sF*^Hc*WaX6wf@ zWvM*dy0;UI&!TwzB%IBdud!2Ik4)RV@QLA_r5V}A?&zKiv@bvQ8iipg+JD|6V*cmD z1e<3ua2AqnMckngIg&H}y?W)lTUMK6+n;AvgX!d!S5=R=Q7)2Ssm^pTGCFJFpBaG8r>qPD%7C*KdCbB?Rb2_<*d2wc-d{15`R^~or&+KiJ-s7 z-lPJ&r1E&3uHIDAm1DuXZ;p@EV(+oig#DVgfaXf^YO*}--FTB;vv#cBjMLp_We=Ps zdEe|Fx{s|?b>5Blnw9i@v+7lw*;Di@*3;}4^M`7)8|1Ov&sQo=Cc`B2QSxs-ZM!U| zWZi23FNbq#0eTb6zkikF^brDr5_oTQ8MH4;nr83s z=JgfYJVCxfU&y7}-aiACdMOy!S!8z&cPy6~kCWsvrIuPWlnar^4+uYTYM6YUbQcv~ zm#Fewd7Omv`GRxowXn}>j^*^U*eGSJd2`9@<)n?a^uNgXMt`btaF0GYCH`Leh;%qc z=NUBOJ~luvt8S{!=G08~Xl_M{&FY~)N0~E|DQ?wRJa;z`d6$~je1gqh8-3C45p#eH z4^$JVbj%;`nGX_a-f~w-$u-FGq4F3`R#&K9uVF2LZrioOTgW$-@2Y~10k=crcwQ5KViOO)KLKDo_Yt?z;_;p2YsH16C5TB$zF@aKl$|+!q*uV zhcG7}qc!J&uxKbgMN%=%iA`UcT`hM zd9TH5GCvFGp)QY+&U)P><}%>ybT3R-@=kleUGX5B%)FmY2= zj2%1PQLQmJ`-TbruB?uQcESc_=<5&JO&Wu;$e}+i1~Ly^gM~c z`z~c(CN{d~uj8e`8w2sHN_@J=fs9MpI z_l~-(7Es~Qvx~w$0Rlhcv&+L(0Rd=}A;miZ5tCiTAOSm*e#JupAd|wyQVsnLtBa5t z9ukke;`*_ZA;w65p4B5yk}jd=RW|wG$=|hgPZ{l7y;t#7OXs>4} ze4ngVsk-kksy)kd4IyvqVmzf+wIfp_;QHh){n&zOxEaS(09>Rz&Y zYe?4-^Fn_pC)q6B9m0dvM8n!t@yo5?KNyej6=P9vo%k8`f`xyb-<3nTl)k;2laI$5 z5BC=M^LvC_nZuN7vmRfDleot$0iu)T$0vWeOa95bnXISgkVZd#A7gNmRKvlfO>s9?rRzJ+ zL%D1z;CN~ck+6)Gzt24HS$?d%A|K(stE%#y()Q+4pqB0L#Too5oRazDJ*?%~?MDLxvD9HZ1P!npyz=z}hZ@!y6VBJ1I>ycl?I7xrg( zjIL+w=XbiEjTHItp+S3JzTMz{1HY^A_?j{3qr=sMVdD+NAQXjk7JBj&4wz$n8g@pwgP_#6`vOHQ+JJfEAmxF<&A4HA2sGD#Jh}ez5@I( z9|q`(7+<`CXG~vL^*i%kqeJm;qINgNw>%DS8Lh0)j)8YOQPv$b=)Sp&aUXiz3;NMl zJ^$XltSf>rLA`3w1{h=Bly)WoV;mT5HDv8P^;?S1pjaZ{@0iDQHl{o03D$qty&9)< zgE2YR%e%)?0{GTVtAI7dlfBLtJWNlS?(IytXks)_HhI9d|KAl16-_7p9ku*dRv?B$JM->Q{j#E zBCEOUWd-I_OJtp|jq6P*Ux0tPd6Z*AS+`$*FW4uHlb~lkdKPETF6;5KvNzX<%1!OE zlp7yj1fM+G>s$~0>NpnVD!YEJ&hT%*>6-$KiMlk}c!;;CYpmW}r*U7ZxtFXln*;qX z)dTt{-Au55MjMr5md2X0y+WS)2=qc{zf$+nz-hEE$a`ibx})idJC}b9k6HfW@_N)} zvPu#CwJ5VXh~IJI_kCWUPtE_T#tLe8v=#ctm?>MlTQ`+Wn7;UEx-4v1KJy&P$Cu+~ z+sl0=y7A$6iasrQ5qonMXUuFWLq9ho$*{NH&V~J9wV3FBIq*!%B}uV>ct-;BA~CrA z0Gh9=yoBX3;4z1LmH`jfF= zw)Z#rB+=LDgmn`eRr2zh~?K&k27S`(Mo)s?Get#v8MP3PMFLv&2k%)%;$l6?i%lP^PDbt2NYv#gv@}kkZ~99{uM=?QlS4%X)I-l z2Ij*mC!r7T4t*Y}GR7S5L8hDW{N3yhPnXeqY0Tx64cao8eg6!Y+}~tv`685l%QajV z!bQEq5C)fe5&3^bc|&p(-pg<(M-9OwYrv$!V3Jp0a_a(~?U~NNWq6oFZG-k=$osN*-mAg8S&!98P;1SGu95CDD|CMrh(}J;C&T3C7+71-HjR1d zQBK8Nl>8nC;5O*=jn)kF`(Zo-$o}0iz!l_YZ$rKo=8Ix$1v)&4dU_%z5OdAC?aPfC z|EJ{s5c!dXPJ?_w#Qx)%%JSlg_$)lvn4fLV=!DtsdF_`KueHwgKBn`la{8L*dS$#t z9UuN)vb=w=z~4k%qR|hZ8|eakE^3@Pk9QRLEhs)6@3su42}?i1x1q%S7PAG}j@8fP z@f^wQ7-LaDKU`zoKb{YE+yy)le&)fgS62LmUau%}YKd5F;2mvP=WRVcysdn=J7g9J zQ@34$^=CGBNiz;Rvl^zVC{OGvM-l&K^)bjicD{d~Q;okO{i>PlX)%Ttp99OiF^uSg z=avs&b9lV3s52PVcRxWJ3FLMQ*rJbaCkwoE zLic}OvGEP0hgJdW zJj7p+Kb-p{{QPj*csb;+y%pXW=YABx>GF!?*E4fAQG6ToCDz(5-U(WMZR+<7HT!vJ zTol&oWcay-H74(7$m_j_TFWgoy_!xJJnw%b){b*9FImdj3pqo?`oo#D&~b?TYR3Xoqu;*#W)1iXLomp>m@sfZc)D4lMa-eth&ju=#z5k`2ODG zSI6e-DbO+bQLNj;K#d`T^eQqWneG9o}8*rdVANkaIIT z|K6vC_pn%xzXFOT;vu3Id>u9Eu+_X}jjI~==_G2?&LcYRh9 z&pF;5EAgt01_~U<K!V9_ovTAl3xS$VyN%wsIAb^4VOKG@&Z7^@nszj{hm(br;yjS@SpoO617V<4y4rrX{qv9imtfazKB zwrb3kEe<&J97#+-t`EinI|6^!=6#@ZWGtC)A|O|lyhP^z`S-v7&i_{Z;jBL%y$7cD ze!6f+&lm2+X8mKwh{xj}K3v9Z&)L6^@Gh195KkmNe2Bx}@W;ng68`&Rr(yrMU2pnN zFqPli4=p7o|NB4W-{^U@eA>kRckJP5Igh=*ct7lW!>!lfET3L~`BQ)J?Q*{Irv1fm z1aJS|IPeu?AJfV;NQdYDfVX9e~PVQ(?tv(Pak4${!Fdb7nA<_e!uwkv|Npz zHitK>w{K(o)!$eDh+Tih=J1~{fBNlD_k+jLaC6~~9;S<>JerzaD+Kd^b9jv2enFktr*W%i~?H zJjWy^@b{D#WyRzcQ+Uo3$T*EbG84!5rRjbul9&t+r4Q{xnTo9D(1=oY;Tx6^oV`oL z*QI#^9SAJQ8^6Clu0P%%H`!XNki9EzZfdQ3vi69-E2-M_`KcB!WUI51I`$DSilH&b z&9U*Mq2sG4Zk8Kv?~*Kkxk3VyuMJWq=Jb$4Ef!T_#?kA=-8Az!NTPAaV+kGU0%6&G zs9jzCtFiar|9CA=H~D|^GXCM;{Qr;mcRTXD<-3^J z`al1x=kxD>f9yX&|C`Zz^S-}ckLCmK05afo`s2oklK+w)Qv{hO!eDzeh&4t}yXkPWe)W!;ET6{x|F69-?{3>j z9^AkEDKN_09chN5N$RlW`OUngPSeq4-By%MK%hy&0s#hxC~985`&RXV8(@P3X(h2{ zVu@g*ySnbKuCBI!j2G%EtuPObf8*FDH2a|ZL_dbT(~m#%M!sX>00Yk(xgXxXRmW~! zrGwSMSHq^iW5boMZ|Nq{L&%UZ*U{r!55HRZe~tRPdUGp$O|vcVXuCf6gdrsV74V4J z9hj=F>=J9e<2oua`OGqA0FQ>MVR`T$;qwS)lAcT7@CJT=7w7SozzALT!tb?gATA8e zRzCX1*Di6~1%Tif&ke_MrT}4M=gNudXsT`yXZ^%CO&F(oaM(z^dj``R{^p8KMg&%% zmS)hgIK}_3tHCPaZG`aPk_TVsy_Wy#y4_25K^u<51+wqK^s(B2qa5)x7cXBrHV&Ad-5qrzEd)`=eh|mH^ zvpU)&cO~)O?|En`?xr5XRY!R29)+qH7ip>^bw@*g9IBYP;{8TG#l~290-P2o&MW4+1h8^>#02zPZ0qy{GYwe2mxT zTU6~;{7JltW20N0GXb3~!Iwar`Hfu(1Yu53BHo3xBk@Kor*-0Ljxpj({gt-j8pDxE z6bdB*sdRnA^c34tDAg#+RtENvjQCVDR)Vm9OTnzebM}&HXvA_EQvs?5WW7~y zu&=~oHJBHB>=0EShCT(5*m>0LF@^L81sf|N|2$X^*44mp6+nrjIuix{^j)GWo~`I) zXj`u5s2)*N3myR_6mLM39#K8tA+BQg==`vgAAV3SM+3up4tnevfRV9bno5@_hNanm z&dA2Tboc1Efs^(_&gY1xH7`)IqI_nuF-OlQ?uK^&SS} z9u14}QG6Oh;tg!Q0FE4DFw%2fEZUsV&XPvmfmR-I;$tMoiSFF61#f7lH}t_c8A zv=0LL*{nQb2^dBZI~v2G@2Opr6!8Iebm-W_fK}sDv%$r13_UASFdw%ky{k-4DM3Mj zz=YPz*CO*PF9}suiR#Hw1DPBWA614+ij;*E2Z;_uPSDCXqw58g!x)Bt=c8fJ;Ueic zRhl+~7L>Q$yS*(Akis6Weazr2r=Gw(cM z(Df3mFX4Ob8Wt?I&R}9}w>ZVpupmmr9KiEON@71(un2ir`6n!ay0jm~79G`Pd^lZ~ z5W5rraS--kjR}siqAEFmQ;9Fk(?T5iGS@3gMf*}9CBZr-J#T%0OH~(aE5nO5CG;j( z&m6ePz($UjC2*P*RjA)!ex_u2s{8~mjQ(Ke89K|EVet3Qm1*is%tY~WNll#sYiozN zB9I^!>@;Pzp6?r%!6rkDAK}kPY-az$2LBLiRzy40)hUt_8fT{9zxa3$;`XWWa%6vK`hw$QV(y~9Vluq%f zRcq3A9CcF0kJN0_BpMIyr&xn9pIR~m1LIHMQxhDoBBU~=RbtjB>gW$K=b<{PXvQ-y zloRll81!3mR!(ql@yyk=ZIh_h%;@It&xUd|X)}+EFV8lAY*dNOwiM+Gwm>;g0Rc~6 z%{+5_dA4DPOVuMq?%rw23?$&^eN?PjnDv<%^Ya)lCgO_;08Sa&w}6Dpww!d(%&(Mi z^X#XLFVh}eHb&CK2!ApYvq9J@`q>tLll_#X{-W8cga+i}RLn^gX-`VjGE9`m1qB?C$uLrs&mhk9&hn@&+gVC+ zocN|^jLekNT)N9rOp|1VpDUsEqh*hmZZ}@Rii^+uFShF9vtItn%ci+^s)_EjbWouv zUXlomi~i#=ssxPuuW127+W$OTr_p{=Q8E&HIwZq?ZZg1?iNKRdh&pMkf3baMhSxB% z*>R6>&!{LZCmD+hmr9wqwZ}wfVLqCZHYbLYy}gP^W}kSwsxyBS^OsR`u{lIFSvXoV z!;x)u3u35K*>mca2cZA%`FV8>!{wIkVE`W4L|JtSQ7qC|5jJXrQm@zP zEB2#*I+56Rf)@{MdwwEgdh9vA_oq!4bE^`E=hq<(lf?>yEEq2{gOL%*%YdU=p>(OZ ztUk+0r5i|Px3plo6$$2Fgx#{qTx8{wHaE}KyAw;hF&xiV&6B`%&Ti~8x_cGY9-sq& z=1769C7ako!zC+4F6^vQ_{n!YJndq-%0sY!eSbo(Z2Mtlx@57Lw*DAXrTg-XhtpSDKL8F>~PGW1PvdFuN$(J-c5 zmdjoFwkyMgi0Vb9VseOStcYmhN{NP!WW#2dg-$aw2-!=i)lh)rq0-jWp7vP)~*FCXm zCLv^!x$==>{VdXC%jY7gkCVvYU4PqH2yn@=Epu<}3W(+St};WJVy#8h50Qmtqck+- zE9l6=(yDkBJdc6gC*Vy1S0LAXRNYfMG}`r4k?YdBZc5+FSo_8Yie3It0N-qjVQgD% z>6$sH$G`w)vjei3$sKx+X~a-Jb(8~r(?TH z&#{M!YSEIGyoF52GYpU15$udVl{n;h;!W6`4aaME`B8f-S)L3bm91mu|c-p463>&zyz4 z)0`Lk)DF%p@}S;aL7MCiUq!S=8>m)az*JBoc&2-k$T-~-ZLz4}@l=rr9b!6Rc5ra! zOuTs_o1>{HU*tiPY>q6FhYOfrJxT0RO8H!eK>~(tmNdmzXp@wACCn%!*WQJ~Vlza0)b2;!=x; zxBQk@Ns#BzYsC_s!{oVgZF!g%YpRCT?%KY0qdJDF8(JG{63igt8ImV8!mAL%kXv;D z<@^$9XF1Wd#d4WRQhx-z0d$pd#HV6^?n&Tx%88*_iXddz!&onQV;4!56cgtPS#;qy zmn=m)szhXF%d-$iWG_@pw}(f>!sKP!kqM)GKP5cB11WtVLqyvgN+_0oq5R!x}*j4;F;aygHhtS%Y&plTk_Va>wjw?&eEqnrcyCbQ}17L)T1w+ri*yZM73T@g6Y?@Z4cy1 zLL8^bPqVBnX7fRE)OvMBkM=Cm)8)6OGO@|P#1u(PCKXGYX;&5JSw@Et58PW`JZ!$Z ztJ9smil9N4UiT<~t3Woy!lEMa$Xuz!$(a09(V|;MG=EYw&EX_53!@Yd6$YFSo(P&X z(Jj05li-m@D?BQ}PC*8%WSNA8D5#aCE0n6lm6572m7V9>V#YOiPj$!`*4Gl=fM~j` z4VSs+*0*iFI|1q^)>I5+>JE!G3MgwAPtC~GoM*2rZ_g*nno|TV72BCZbLaLsXBcWq zoFR`L7Jn&cNla&l$TH9#k#s zAG|H4Sf}G?PKJsd5s8(Qot+U%06lNQm|Ud^jDHBub_4J{>7d!Tokyu;cDQg`7#6j@ zVml==YPT5FrI0=2zW1e4T&yJ6>_vKiWyf6Av1O_yYKI8e;RSZUT zeZ$njAzusA3|zc>J)KrSi(m}nNzof`RR@v!$*W)HJA5>avR0RPV?wO5 zDH#%H1v3f^6d9B_B#Yd32&fq!G8aXh9U>0d?xf90Sr%_I9rlYYyjrcsgC&ON`+xp) zt6vJq)8|r39?JB$6orX{96I(er~JgCm*W9GtW$BCv}0+euM>BVZGF`7qQ!aavE&fT z5TMvNvE#E6P|kM5x|_Te^_!lamm$VS8YEbR!IU1nj7TTmSS(d#3}SBvgE&uJz^qB) zHhu7XxfIPBdXe;ujrS*_W}+a~B7dou7-}Yin%BotjA&7rvjtTmli{7hDrL*E>~X>z zJbT1)lXvhfmZ8EiXIUUsQpvGA2WJ5NM^!1GE@QPy4{fKCpk-0Fi*)9sld$?U#qKaG zb!x_#Oy>EHsj4Cyo^%XS3a~NH46!sFaN&sV{&(_*kO(#4B-cvlc04Cezx}1|^ygREZS2pmkiMO>K?^ z9!oX%49hPuS)G-VEb)R}rhjex#KyGt#4JN60%BgGHTtZ23Do!0Qqc4aD_ZJas(CDF za@q@~t(G8DPbRN3+@|nKP}S&_Xd6_}FZGUHM%Nf1BC4eky9``bsR2?|i>JL}+Lpv! zgu%vO#6gj2PsSx0`(_Eg9I4u)+AjeMugO#91=|C!gySJr ziRu#V9YgbaqY`iUBT_&~>=XRe?w2dDUbt`i(RMw>@xj3v z66J|F7=Kb+njWrniGSh}PkAy_<)m_RoB7ga*H@N5q~YlFp7lK8K=rn zJ7u*I-0)m!7WS@Tsm|nVgqzuzevw)S6fQxoXpN(PJgg{P+K*z3j$~F8!HlLal{0uK zcEc*Y0u;-e<;*8W>wju${bjOs9IRu~^VSEb&0Rw$3^`Wf*6+mO%P`(MkS-rs^5TZy z^CY1B1TT#KVCES*%b8*Dce+~QT$NW1nRsgXf*C>!%)K?coQg4}ijrnwE;-ycEZG_> zGcy$*nU!PyOz8N_Rj{3zZz%R*K{WyoL(W*?%tA&D4n*_HO}N_gg+}M1-qi!_bwYGP*Tiva9+r3S)v9q&5wi*vB5}TG3-b)JD zEQN&@6eLh}jJujP;12UjY~Rrca3LUcReY>_&)%A%iX=hXcg;y5I_at8TF~9!WYE)d zFKCVYWPes#DdeQ0_x8|mNt{zF!rUcbBgi@fJ`3S5g&O7Z%jsT81mVz?b5OorDN+=b zr>kkc<6ugf?bb&i$vxW{uCB2fxa>v-+Xa!QT93*7yoSkk&-pmZU3&Va$x7Mok}JCX zp|{;@OUGT@QdJ6NZUk-B6m{&bYx?64&8>GI6o1SBk7P=EY<#>N^kKypFoZl=WJQXn zvE(J_FZ6|EwN1Huo3bix%5JrUOW@3l3UdLNQekt-6`it6;%ZI?r-{lyoS`CW+7~Rs z(sVpc#Z(+u@lTO5q&cP_2M-+!_srTBi;B&U6~h|&v)t$+D~wnydl6`1ZmPI~xf79o z8Gqv!?WKs>sW$F3kU&Aj9MljT&BCK!o&35dMrC}HE;+y;HSvi zmL81Tb}xx$TR~-D8LDfxX@dC1YkUOX5;n>lmp-TDSzwn=M@FH~lCu*%p(E(DC}Bv< zx{M?&r0y-voKrFH5z~)xS?J-ynl7VNaDTje1RP9Q3W)b}ascFB%l#=SFgk+7_bT*^kmGVYpL zUKkDr-&jZpE?J3vZa+9+UKzHj?6%t!XUx56nxnmCp=p(dW|qw`S!gyYULen2zyFNy zkaHu)BaQQ@r_2t&sS_B4Do7PK(u4Or=khLg9ms36bD1Q}VW4x{oD6MeG=DJM;XHg3 z>*rOli>ppPR&zhwU+T8#7$I|+W?br0A&I0|aM(w-OHZfP_xRsro+Q~3!dULO8k^R1 z=9NCHcAf)6%mOX#uo_|oDIrqeD2C)ta&@Cu-SF>T-(j_Qi3u$FLxa0RaaciWs(_Vm zoS;0#6HIVvWl4O6tT98{M1P8BX1KH}oyj-Vhm)EsdB&VjnwUdFYV?lgFqjcXt;6d;3jvK7Jpc4latuC&#pEt`S1ZnmxWjQ692JrO|MpArdz;9BnE1vWe zKRtRE);wNTq?=daWU*Xw8Mh*N8CV96CNQW~Ss~@D?p_7XV&|u)ZGXD~_e=*BazIETU zyJZR-m#h+8vf^)vwk7z`REJ$%m2Yp^7R{tC^G1njmLcY-l)yQvQHF2J*3&IjJC&6t zm2Yl%B`V!cuzr@5Nq@^QFgd2}LhRKZSZo*R65R{^oL5e+Xp{Jo5G8h1WOL)a#Ikn^ zaIeBvzG`b1I?FC`bY^z0K|NTqz{N`)*p zl}YoEyy0mnWET_9m2}FJ=d8qea4jlbfSvVbxhSf*!Z9&Nu75%-m!1gY^?Q{^EJ$W5 z|0k$@tl4aFi+?!|(L8g4mAEVg&xu*MB#4uO?@^OJSSqZ2 z;X6!#s2wT*B5mo;PwoynWjTB=}ui zY`=|a+qZ`6`ow*^(P~I3T{%8kr1lL(wj?Z-?K6(DhMX;zD~pb^t<^7>&|Ja5djq09 zVi0|fb!b+1ufnFXhL|tC&r0Z#ATQdT-)vH;B z7UlponYd6TsOj_tNq1n1GZeC#$YW?*lk6n?8F}rGb67~`6tf;V-A#Xq5~N`G!VoFL zs-g;^l_+PBL5OcB@~=jq|8nA*@4aUjs~j_VN$+f!D?}^0n8h5>drS7$j0!Y4a1-dS>y@*_l<+n>)~Du)_#l+^!GwVJSsVIVTWni7qMPqSDr{4(yzYjWzlPq86hbtm2v;sErhcai>4WlDwaYY z0%xeEYtvFDs%e7K7|p%Uy4${3$tQ%w(qrzN$A4VZNWo9hbCyVAD?N#nD&D8}E?zl_ z>lf#m&kUN2v({u@DyJfEb5VJgT+%880MGRV0-(Xv%stheyPn01ZSShieCVn2P;8Di zPAT`?0|(_!#m>N$ed2*BtUp-kuUz)kbXzN8R~5^xP|l@L5ZR2P%*HzT#%giaB4GhRo@@VoK@TG)pq0N_2%cAt@ z!F(ewU)*Avex6v`jp2B{YMum3>Dl#kx_`G<5vvE_OyYFhwmV~GH*S$@$tE+Gze_?k z`>J#nXCa7Z+Pcx3oZt?(1Oh8Mo>}JPTf;Gp>lP2mQ&cU_&+?^;yp-Rmh_d^V`FHGqyVL&GN})8C(tj2| z?FAQD=gM*tQ0LgW61SjeQLtgOlvCG9+dcDC=Na72SFa03vX`gC7Ci0~)1d`+Wx=tG ztASJUIi4jiZWel^irfS!Y##I-C@9A($hn>nf>cQ?Q+u?!ol*|@+T zW^h%XOcWzA^(Ak|zK&~QrUYQ}P=8dJ*~!Afa?hw;TQIZp=zL_ggmjV7(VT`j&1IeV>eor4vglbDK$80c7>}Dt~;5jGZO9 zrP}oBwrN$Cg@t?y?7{EdxHB==p#e51a~5a4yIsg_TMj^`jfn(0BSiqcdNV@THODNU48Y+=a>$1P<+DnIujg)?@?J;#^J zab#GU>Fe~oYKXrQbAP9umMY{dGx=0^`CLAeQK&L|Q+5ini65~U#R zBAuJ+r0>|iHJ_r->GD-9eMI)u3CTzxne8enog|fd#WFvqud}d(mk^ifTNeM+sGJE~ zh!IdW=A}QZi1joOs|A~z*UEY>0p<1`m6f2KYy^c*E613(O$l;X4fm}M6(@we{@~Q{py;8lHl**w!i3m35Oi!I-5B6 zot-7{O#?ZLK{xOEJGM~|M6js1-lXtC`LMDAzHo`HXNqPQdkDcJ`1>+4QnBHh$#csa zs-mrE+8J_l6v?*ljeNH6oB`0>{#D+TQm#|UgPBvA>3`IAhN`JB-iX-b>FmVboPLUP zDhT_5ZkPdz;ANR?%V|i?^Ney&?BP%pF1%0NW%_2NQGZu&ZqZ(`^l_g!pitOUJGYl- z2Lt{7#eZ^Kck9R2?e5q6J#~DiPHvhTlfCwjS6|;ge%krx(Ej(zo8RC3ufN{Uh!y30 zi)kM8pMN?PAHD9mm5tG8G`6=lm8|FVr@5j0uZ^wkMzguS-GFwDX6s#J3w~DyLBS7r zx~c=9%-au}iW2<(gZ!}SnaY2E|JPrU`@jF>$p6>sq<@P1x3*jFwo~%I`EK*O{4e8Y z1-JXr5zxGqf4yNB#npB2{jK1D%qr6nZcSPF<$o9Aio(gtf7$Ywt$dZ=*Z%c}?jbA4 zK*vT``M2Vb-+aR%tC_3WmEZ+-X+^X>zs4eH0nLADMjO=YZ)06xgI0Efw{PM9%0HCI zwV5t^axNAg$`LK$f{)*@q3h6(YOY#j%*L*tl0LXSkq2#Er=R$2>ns&(wbfXwDH+e3 zjeoVZwK_#uOK|c(A69|%M+RAJ?vd2KvRDV-|GWAc^>lW#+Cf{D)Xi+tlXwPPU843ei zO8Jfxn|h2xQ%uJD#J5tzZf|A{OFu-G%P<&~=h+r<^U)Elg1i?zh4+7wR~k*Bx8z8isSnnEPO&~}EC`N^W z&}GVS0QOIfpM{o6F@4ym6*St;Y80jN$||G8)*2^A0M1%y9!}IzLfBjR(yqV@opAd_ z!DuetPNA$~B%hYc7Y9t%D08<$)qfCvY=s{)l>z%I+*JY)fBHMT`1hX!dds~7y+__@ z%8&C?Gr%%6SPWHJGp7di5L#NE(mwCtCsABj33oT}@d3Te2*-(|dm|6s|5f--*9~(v zP{|F|XJhCO`IC(Xb3U*airI~`?gz!SeMcj} zPa_b;>x<)m;~~Kh@X_S8tbf5Fw5@;Pw(j<3jZ8kZ?(aUmsJAXOHgf_2KT-Wq9-ElB)=;QM8`71oTNIbiOXCD*K z&f(d)cy<-TPYg~z@2U8y`rR!2#Ara$Rr|1N`93Sf%ir!qRGc)GP!$kSQl-(<*l z0ZjR{m8N6tSsFgdgEzl{9-?s4c>#S;=iFXV{#3K|6@#7gC4=cm--F*bF&#krKiT?h z2)MKOIY(!t=zkic1IKHOPm1aFavI<~3%?n7!#N|)3*?iHAE(VU{y#~;8{^kB-6#%m zuKB#i$B)Sl$1%qf8zZw_3D}PtpEF^P+5kp7t%!E~8ROv+;~%PzpILjxn@7ioFozpv zdv78g5vgiFH=Tia=>}nLS1u{DO2MK{yupW zw(+_MUwJ5?=D|sv_l}y#dmiUKKk1)j$;5(u%~{ssJQh{x&&72Y zJo}PZV@+E#QCwWzB;#Si&t&nlgH8mmH|Y26Q@>C6Y?Ju>;_{K^=V**jYn(oHtqZej zeWr0i^|m?gZhUHVj!p;Nqtg@hw$neq+<%?i-yJs9yHDnidwN@Iojz$t*H5Z-I#Ms2 zEQWadJo;j2qqF9-AM~+j_rKhoz<;MN_jlOm{iNG!^gp!@U$oZEMBmfi-5qU>x_7%z zn)SI)CcC@$N1xr!0Uf*9JvwZ3H#+dS+3bG27->h(TgQ95XZN@IKtH;6JBPbZI)C&7 z&#v^_M!$EtJJg0dUT079kBuD{V7FrMe02L?T05S0wDY3gU5vV|&D?kHjy9i;;rH?6 zeg8*ecfZ@(deJ|AYJSrwId9r%8$1^qVfq20;X9N6|x0N3po#OukV{eN3$|HSPu zm_Bzmbby1w`lWRUvWEP&b*A4ojr+TfeKL6zZL{ES0DgRZcraaK0+Q z$JW^u;CpX3AD#$3e!TKB_@MtR-oHND*}!-5@rSS#&TpKYUxI&6@9!?`ZtLPjJO|$V zN_l#Z_1D>Nu(`)&&t|aWvjY?V3zuUB0U>{GAdls}OZnw%8+m7PvWI*VJaZX7PvW#k zdQG*q0raW81kW$Y34D#zz(LmQg@ee<+IaL<1T zU`gme|8w}+yxQ0`wc%j{_nM9$!8V|7ZkhD+^~S|Sz1_0l_g44l+P^ru`3ia!bn(q& zwyxoLJKDL@QBMv5-}TtokNDlz_zOJKCR^@3;8s8CyPbWeAF-cf3wRUv=b*paNxr^0E!Gdu zCwsy7Dczr`zl_5EUO?aU?{f4S$e`2NzwZAyX+u9$kE5=90UKScgQNIpy5oPlh|M@< zJe`u$D2{GlKIst~*vgih0fQsPljHu~UdI+Z0b?QTh_l!ne!LkQv`>@M9DRU;=0N)x zwfE>xopS%_WRkB}-9GZwf4^~I18#G4(m;#_{^8B!3)L@MFITsRa9apy&D0~f=z!1TiQL^8QgPv zbq?-<7jJy9fxFiSCVv*Pv=vGucA8ZkZgmcRGLjpT}u<4w7TU`C$_A{otJpTHOFnp1Q{FSYtE?{M^KR72Z#i zwlf2|Y?ZXFTg84V$awKQCil08k2fH*z}Flneb8;~E#|YP=C#{B8uzv68sX!`7RW|q zZnRxPYdw!(4Yqv`vi{}vlY4*J1lb%ka9!0MUT=4Y?>%Z?T04L4{SCJ@_&3N?x24&i zT071sI{v0{ch~s$x6YpawUvB`j+jG8OFf;|IPgK zKh3R1GXMWw^IhwE{{J$5JXf==p3$#kD%Km8?8W}p4cB{9M^}+`y6_L4 z4SN&gmp655qWyou&TL{*-xG0=r{28z8?9`FuYK!ze*ek-k(B?vkL}Z=gX6QK`cN-D zMzQ>Fx8A)=$$w*G9>oD`e!@csMAi z6RO*q&r5^Q%8AgVXPBh^=8_QQr#;(xf-hML@SZ&!8lHdq^XkC!M(&5VZ?(v`8vC+t zJN-3!;F~>A`o5tP%rtfDZ{GZms^Dqie~Z(;|M{P{>VMw+@PqObdk}UFhHBt<@#w(Y zXvOlkc$PqQ$lE9S!e+f*XMb(2DXXnUb7#HLT5r8udxJm!_{XX3kq`g)hjPQt87p0X zI8yLRC<=ce7aAocCrLmzlYnlP1#}|-bTa~IW3ysFH7KpQ0i-3j1qMB!{z z3+GM(%$<@@z86sLED*@|2_WB>1oE8#@_hhgW4(V>u?)RS0Qs&YklO;tcM%|g_LTy; zod9yXB#>JI$ZY{+V`sfpF_1|+RMrdyR%j~%WV2#&Cv8w!6BJmW%_xu+V=`%f%9@|R z`fNmiY;0ExWYYGOHa!B!)&hY{*`1O=hE^v4^8I?NVxtq-90p@Ki?bcdO(P0p#TNYa z!?=H)knQb~vb`;2dpjcA`2T8wjED{W7#V49fBRc6pZ@SalIwpF$C+u2De=EXYcsk2 z-`?JQ_kI1pj2}kwIxhqCZ)LOfy%5k}=|@ujk2`w@rVJRa9oIt)eu z-D%^po0qd)Kzdu(C#1xLXksy9(o-y7JD@j}Pr{bapCD?h`aeMf~Ctv+qU@el!k z^i@+ipk1ecpydjJyM{E{i+}>q0BwJHH~g|4{K~*E@_=13-b1_TePP4Zq==u})~)mUS%V!fam zkk7&3HuMLs4*k1^k#9}K`dHA8_rkuS7;u!KYJut$cQ3iVHsFBOl<|Pj=>wN>4FMzr zv#n;$`quPsZ$T*B>&<~T{A<+$XJ#1v! zx3=?`QVL^uNFkar6+fGdWBYLTZ+7ua3Q#mWC zfnE^W4bT9M1N9cY(hJp!=b>%U*;W>VmUppAFLO|_%)P?)xY&hg{4TKe2(QUCo81KoTq(m;p?K~zY3IPoB^4?5Qa56`wiFX!U?NDR40FMW@NreJl zGx`Q@>ZNI(*2h9m^b^hN=r zzzJI#z=55`XhL~d=bnh@$!55rZ^8F@z}F%|;fXC*Q>bm%?}F~&%0u`al)EV86g(~p zbReq7Q*MQzGBtOF)*|YtpjM{CBfobEAhQRk$ah}ktUX@q!{;PQR5N=GAE;$`iD0>U z#|C9wLzh4h0UrT`mtYV96@O8SnykPTawo1whHg}agU$5`nh=fJNZx{xA1xpARsvru ziu77Ujl{Shf^Ebb__&(yQY%kK98!JB-N;+2@j}x?o&^%(a~1rEMWaTB=G(pt!aG!* zM^t@I=p6}{i?~MLQhA;M(ug89lM_){t(*eBRV6B`^_8>;C;aPR+J8a!0uzYFgI7J*SmrV5N6JOP-QsdecS?pQ?EZBaKr(8bhQPK}sh&Z%x;1louY=v+mm z`zN5zDxrn@P{3fx5l#AW*@9?I8L_!Ws0Z#kbT&|*2=(#=K!0={ZTEWU=YbI*Ca7Qb zFK86o@fcwOJ-{7h?iErsBW8vuU^Eh=(&}<(8gTD`Vi|Q82Te0o1Mtn-MkWVXq@6^u z8|Y07q}O#-$Dq>L!?KcMMMDf>`=Wxs>aM{u*tQ6_h@k$!BZ=OTWjM(f#Dv%ims?u^ zpE-GP;P?<@B!7jlb#`6{_`-cPG+2Re?bxon zP7$WioGc&xC-#|MF=MJ@*Ec+zs!96H2+(V#81SJ_kkE=n3XWYuOaXWKQakKN3yCuk z(-QO;Qco4SVXj!56NSqp7NcBJ#6lyKF>dmNSH-LYihn3lPwe1ski{I&y&9A7pw z6P}~VYT;6dA|zz3At8*)J==se5wq_?cYP3cc2!+tGsTO<`Uo$A$JQG_Rs*JJd2Y=0 z4OWNvlYg41O6@~(CGjt6M#Y%j$e1i}6S~s4j>7dj3+gz?LU@Cug?z$Rk8WgmRB-`I zW1lP;QfCv#e&Qo*k&zwZfq>P7-yB)O)71e$l$=~-;9$UzA!_s{_P{#UICs}jE$RgQ zrdq_Ape*Wz;>PF3LJ%47BvmT@gq|DIo}v#5oPTaphZd`qsyIcPOPu3{hKtQ4ZK~r) z)7MaG1@z|&KP2_a>Dg6h?_dRl@7bgHMzP~#pvxT@Cn{YL6_6n*Da=xOMY5>#88Z@+(H=s6_qVkmd~J|{rCvf(r~?5jKt?R+ z(9zd%l9PZo7QJ=}Og}glM1@7@)qt(SP=BS-9HBRL9@tVk2=ZY$E?ZP% zO=7Y6z-*|xj(L9)EM?%AVhRdbUlUP4P7Ue?hl3A8siwDSlEC1 zPmnXI(ZKc6_<^UuDUlCGZCwv}J zkTE1@pw}Anax*;mFtnGkWyHFP>=oI)3}|Yh*!1XPagwtXiALuFQKJ3f(2;0f2taDL zDrSWPuNz~@)Rjg)iiKr@l}chI5F>xc7G3P{odC904ZT3Ou3TGSMO{iX@{ARs4P5@x z9wQqhL40G9^dcj{tVkFuH*^(x`Z!`Tki%TPZZ!H_W@*OVEDC0XVOST;b=Af0BYXeU z_VA@(_lDY+uFV!@D7JmNyhAfWL34dD2QJYG+XzB2h>(O2#Jmd@AO$Q2OQL^1tm!D@ zPq>886&ZOZT13TD#Ty{RA$`?h`%1~R2j2_W2305=5Es>A#E;f(syRL8az}QA5b=CN zjkzyk8v}0v`UM60f{S=G81*8~6UOxUN6Z3aJj@ykrWFtiP6?N({3;m66JXF?pb46E zN>VWV_7JzH5gNcU_#GNdkdq=MWSN08;E}d}Gwx`_U zrIi-$UveP`KqYtsL|FKzKjuf z4dYs%@>klIO6PJ#*==8TE(LOLJ69jiuCJ8a_Qgf}^r~}kshnLzx8=_cmG7v;y! z={~qS2HOE<*9(R-F{obABVp1|f@qvn6?$p{i(HB-x*&4WDi)A=)ww!8r~%eb*E^?& z7oF3igOh{PtD16haDk`RuG+huotJ8x^mOjwteVn&1fMD0h?F;4n`r`cT z@_<=ewp(c8&H}(c!uyfwt^?hFnPIEKIJ*Gl9DC##=$_LF_kg>w3FW^~<3{48EZXS0 z;1l6=g}OFes@YvzGlFF@Q|f%5l}2Nu8?EWZEaScRb@(h$iZ2}-YS%F7=6MG#uR`!3 z7KMZL0gp@?>;xELr5y>ih@C7CGsPky1B>)c1H3Pd;N35Lx4RY#6=EEI&>7cKE@-0eG4(9hZzVi-5t-C52ih1<^zK=f@G#a2j&q0N?LWO_Tw>pd|RXh zgvkN!h~VCOWcL{a3LIOum4FTmi|OKq9Pdu*D42u&pqF194gVn-+J#hgQPTRB@!}e`k#{+(m*x@4>WqUMIF-nL&fscUqRKxTg zW{p&{=Ubt3LycfYCJ4QP)X`%2U;`5u7zgy%5 z8+i9j0(R<3TcdZ502YMi#gW^gp^gZ}?Eqc(xVR=a3k$c~gcquR4Q!i5L20Bjw%JZ& zuHd)z2-PQ`>L`S&r4crX5etKI?Kh!(M}`)rmV^N@hE`L+uGn3ZN1>?S@)p$&dcLl> z+#ThGudfWDL4yUxM|+GbA-0qZ5JvGC={TGp&1kXA$ZkmBbMtKx8pP#~QIUpfl)_6r zop2W=)aYTPD8dFhJSL25CZosnGYUMDcZ!={fE%6kV7bEH0MA&@2%W3WkZK~~TnAVT z#o2e9aJP&{j@ivBxL9RD)LNIy838MQ0ZB-s1)xzUJbfXWx`*FUP{zSt68v0AzEI<7 z6!B<+aI0;Q8V8o)o``DH!j*i_Ag1mrU?4!)nbPm#E+qlZT>0tel|b>)$ON}`6TwVW ztMXM}WF=i!R`+e|??JvmL`FsDe_K=NYMm}qU2rde6Trm};NYu+h}n+p&7!P-xD(Ll z&%s70UDPuGKu^Gnri&X?tTm653N23CGQI&WLywg$yQrHv62@3;t#(P6vO;%A1tc!M zxI*tUhObZuub{1n?|ky)7X%X+&j|M8Ip)N^YY?6ZgB+@(4RFVrF+;eSi03nu_E3ER zJZqR_(Xq6;*zHz(Fge5)c>Q>PUi^aTmnFsyJ`eqS>O#DmDlbGS~iv zU5LdBY6)iBcx+wx_=d&Ts8nwT>=yVxN*EHbyEK%h#^QN`%T-Uv!nAx;o&~)QAk$Z5 z-1j`kgeRn7H<5T-I{gWE6rv6C-19kobK#X!wBZT>0_-A zE1CAkLn)y%@22Nf|JIq$-+%B&GXI|~YG)i{TK%8qRx1C$+4z3`XDL6lzE4$}|65Py z`%mc~N%`l^Xl1CPG!#9?N2 z?AFylE8&XaciJ=arrogXu5Xw+zKMf}?YIX=2c>=;x^N6$Sa#qY!nQLBd%=`zbnJY1^_W4!}S0F delta 67332 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 W{pb77_n#O3^Zx^DaNbV<90mZ?A=3E( diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.15.jsii.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/jsii-calc@0.7.15.jsii.tgz index 98fd2d0f53be3df1accb1b0300b13c6ef49b2b8c..ed86b811e526056a84c870825fa150c655b7fcf4 100644 GIT binary patch delta 67347 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 !!`m+{EknTQ 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 delta 67332 zcmV)FK)=7jxCHLF1b-ik2mk;800003?7eAY>lTm`-e~_PlzfqJ0TOAk+AC!g9o@u_-R7+b}#;+d?*E1a(pHwUBmD&pXS~on+ zHHSWbw5fRJU}zZ%zBp2S$5lEb)AAL^Ru0;&R)xJaP)%xXnVom0ts76kYV3(W9vWWs zkzVon!=YIGg= zUEl1gn$O;n#tIsJ;eUM*?=9$#ZySDeE=WQTCPcH@WPf84_Ah7>TS3RiLBr()CKwQT zZ=VJY6Hs}>zG*)pR19MLFFjpg>=F`V0r^803@1qTsQOx8e5t&B3`hwe;McaJ8w!4S zhyNk609KX1{Y}x$Zuc#I$sVhoXAC;lm~gJpe-{E+IwM=R41L=e8o+6`W)kcD!iEa? z|1EEZ?|=QunLhFYpUD69G-qhMlipK3qQL)?1SYK=uzE_fKcia#Rp|}{! zD%VCwX&df?sTo4d7DldxE&9Gc^gg_Mr#^Z@B!4w$AR0MtPqocwmFqNAHNlvgWBabz z83Ff)tP*Gy0l|)?>PpkF-?ltgHLO6m;^X&Bzd!2W*zXK@r4u%E9ZTXxu4GKxhkr(( z4t{+j30(q+b5nDa{gL^(1Dd-C2(I~5bzOJ9Ksfk@a-_PNs+)%U_Gn~ThFb(2_G-L+ z8Go1pd9{ECY{vYXpxye$+j^zSOp0p^9nS=EjzdO5w!^jnOa|jfU;+np^TjJofas))|4sAH1&F1+bgAEj=gxk?rlP$+#88eLYR4zZ| zu|o#$e94dTrd6A9s54*B?jl3;G7P6{UwW3Mff*cGTA1PXWi&AZ`31Cbgu>ET8Csd1 zWou@7Jgs)7m#5Ou8Izc&rq0AuI)9f;rL}2{iN+^KgU36F>6EYTZ_MA*_)0#;x8_^S z+pG95@g@$<&itGS=9?&cGP*sTN71O-kEk zEK<3Kst-b+0!ZxM>&_!V`kg{c03rW;v_IMxebZ9_C9dj@75H=H8M@*-ihphl9NY6< z)i)H?))ls(&^MH>q531&@D!&@^TSTQ`%Y=odPmS>*943_nwF(>48^oH#~nJ@mkuAG zckGC*kSMyNjRpn;&xp_pcF^j=bI}LpqkIp#^7{aX@^N9m_Hh9Kwhd(wf^=u(0^&VG z`IMO5r=?};=cC;Rq?mRufPaVPsConigBxZ%G&Kd0T2W5md-u`wjAd$pU*cr(?}4L_ zEaRiS_$k2qr=@7WCSVQ5qnWV(g_)R_$+hxTrM@vx1xLKA2|kG{v7`c>$>sOU1hU_Vt=OjTbAlYdQ|y? zxLpz}dP(u8$BCd~q5HcXX&W7~DcRHzHTmy^qnWnpo2q3#8*X&a=mWln6deOpf#Cva zW689L7Ei#@5-+t->!Ri`^yWAUT|&Kw$+&ydW_%Q##=!9Vj-CTY1~C}vxh@uMj;OP^ zQFo!0Z@AGh;^Rd6qch*h0FWt+6t{5bngc-k17m341)Z1h=`x+CUnAhU1}J$u#qXXl zM%bfdoD;4RP0q15bCZ?^VSjMS1{*JYHM*XY97Zra8x4aFUy_a!)ww`)5Abzl2mlMJ zpb55dDs{*J$+34&eDCC9$6i2tqzC{2fA|4)vorqN7R?A5PZ`h<{xIfG7xC5MzR4 ztf)%HRHA`-Qi!F8nO;#M+m`?-4%VU3_22d}RQ15NGQ8LmQg4FwtiBgdY-D&@0;g$N zh02v`jf$qH%1`jz?DeOfq5C>B4F3LgZkjq3GcsPUkoHFA89?kdCKL=7Qq{Czf`73&jpuR>86^ zBJuoW(=b7;o1Q|Ffypv!1n5vW<;F_aaTV3F6v`kd-e@>LkF(?N1a6p4*#Vg59)}kktB}4(P;hQO9g;(MaaT#%pH)gH_|&RB-gJ|&2qzaG zV$K6~IHws;9Vo}(EivfVkVNC_9u zeo2!|2_+dOzMH)1YVJy&Nb$Np#EVlu-D0wzvebWRlZpv97M%;V?``Mt)$PVN5OMLD z|BppoeAcg%*9kgKIwN-^v;Yhc-IXTpc>^X7C1JHl-^t6*-3MGH5;{wZ0@ZzrH z%uZz79(#)K{nu_6^X4TEPv3?#j9*q5ih}VxH5e(Gyc9U*E0i9I%i>cpsq_M=?35Nv zZ%%^wKf-S5WX`klahscE>%Fn9U74;wQmv!FbWU&VQ@Z;mtUW*n0L`!kb~)a}8JM22 zkmtfqD}@Im&&Sg)mZyJw43_VYj0?y4xG-6=*i7qxjH%MPJR>5Xu}>SY*d#tKC@M0P zXaPK6x)9P?<7MTsZ)$zE8V|47A8pfqaPAF7RUR1o@t1J*9>y?nKh;M7Xwj;h*X6Ek+m&KMvW(ZLM;==bq1#6J5elO@Dx?C9e)M4^PY=Miyms?U@tE_?&v={Vw0y=WG7Y}36nYG&z-*6 ziuBKuEetLKUviUO3^#wesf6dWdGsZU@}ULOMy?Aj`95eQ59N;FkxsP%0^3{2)Jhnc zqm>PNRh-Ue2qY_C*U+}aILs*tbwQ<=DZ&@Z8lyBEpQiMqcw^c7@MmBXFNy-8c zg_pdDFkyihTh+hDHukT*^uo790G}n1hKC*mRtq2yLg)WM1Rj55B0LRy1u$kCy~(lM zWGkpbe4RJV`bNRrY(qV!ah64}Du=}MQehsMaZ_EPBe-R4Ikx{6V`QAmKz%X?qk)LWSS)7R ztn!;w@UMW6r#=Y^4MP%e@e@?@0WQr{P61rwMSzQ! zZJBv#S3q2h@8)JG6Rh=8^+Sq6f72)pP5BBsMPaGWISQV|KyDl0O#xRR*X*m_u@f5Y zN}|YhXh!rp5W*FP+Brl&|N(>3&0uogw2!c(WEL7A%PTpl!&*K=*fke7OF+PJ|% z3Ko8fY{$Wc9Wj+@l8Nkq)`d&IUJ(Q0RGYBcMRvO}jyn-{{^i%B=eS28x&9k-PzqHQ znL#o{|C{z4mH=lf)KUsuX$iGruQ`Jpv6KfJoA>t{LS7?N9LI^`{)diHZ zOQe(LL{p2`Wu}56;P;`clp{WK_U9f1ekYt5nx+Usiam_W>OK_OuDK#%QCu#;e&h2i-*m2 zcXhI}Zz5^Xq3a$6aC49i5m?MgJW?Z-C>i6Q<`i@n5sd^*GdM}i!Ysu@xe4c;2LsKT z=$2jjY2cAZJ3K1EPCcn%ImH9$gDX*&=R?w88mlhpEIVR zCgd5i*x@DRERN~)6j=(|gT3SzebsOGosk8evfnf|w^d)gh-!cS+0`B>gHf*^Q*KIM z^{6DVbSP|DG3lOS-SmDRfg$ahhR(dnj=_$Gi7jFu?T(?TBhR2W>^?Zvez56F8iXB1 z<3;0xw+kuO$vB#kp&~~_A|+*~XM_?!&$?l(SfvTf2u^nc@GRRw({VeCQc3Ob#cg3& z)cS(0loV0B`JjKk3fWWcdw*4mi%5daUTp85+c8)5(X#+Yq|Lvpt*?HxTk;XtCp_P} zh{>qV$h35D$d|%x1|HtMp4?VIMKA_YB~VB^9PP6ullrzOLuTFPnBih!EE8jyqdbOgMLDh_XCpEc*4yc@TKZU$3i zYCbM1pLBmqo(jx5-IQds#2|A??BSs{I-14`GUX7wh;`0}ab5?Jdhx4YW;=W|iL!Rb z@E;AsF1sb8z*)hR0t0ylB?`$)E;|I&j1HNJBF+wyL)IK`a#EJX+f;}BB7s-EUj1l` z;rY5hE%g^d^5nUcl7}+=y^6xbL3UkdkWqf(rNe*m03Y_TI8EBJHEX0B-WFT>sNhA5 zv)JQ;L%fCnMaGF7pDh68bVsZ^@mo>9>go9+#Mq}K!Als-!h@F)>DU`DOVuIELY2sh@J?=( zve$pI>`}t(Jo$$0#qZ#IS%wP7oF+h;OC`th9Gn95A62Csv?H}jcO7>wNz1%$U(%T? zya}sETkLkzwoXl%lSw__F;P{d!;{QG76PoyftzCaqC7elL zpy`^nTO#kE{}WIaIZKwO0ZbUX!QH3yu$7iJ_Nxg%+QR zx91xH3b*(Ar5KKvs4mgoH8sCGEb)KFXlRs>U+>W@WwN}nt@T|8i=LFA0`7e-)7o`P za49t})4i+Oo@ta3V|1m;v@W5X9~`p;A|D(J7|1HLxhThjEaSO9_D$<`SI-XMugzY$ z0_(Z!ru&ZPEA9v!oPnV{7%t|Y6pyxtD;-1e3}1OLRpp@FYW=pkw{v_^UuQJ##jqbtkoW<+gU>ZFYdq@}jGq(pp~sO5{sma>m6MPd78&IhGq&8n z@%{ty?4!c{ZbmQKIPDGlrv0RozZhzNS0`^U40=69Ut_*vG4IRX3ekaI4-fd)h9kWA z(f5>*2YBv`i6Xx0-B&*1mCdHk*?c)Da1FdRKvrfHaj~8z_Vge%rpx}Yqk%DS+_4gD z#{clquCJ~siRHXl@zHUx^+td9>$wX(X`TvlrMpZZ?&qrF;xtHY}W z-W0DaD-Hb53cg&c)>o9p+T@ob?=33?!y5i)9slzl`>I!0-Ybjs$$d51z9#I6)Ikk8 zLWNPIUz*F}tB>|dbpx=nQoO_Wyu(H{y~B?-RYDf33jRbROBbEujo!N9T4OxY#s%sE z2)>P%deiOE;mv1xk^_V+AUeZ;(Q9rKc`1QW2M%~I$|4}}$ZRelzjMN*hz-Ym*EGPr zfj>l*N+K8tjWQT{c-tI^jUCwgu7h{cB1xu@w~w|EIFx5u+CJJbDT*)`whq`nBA57P zQi?KPjz}iHJ5h)-yNbvuc2!JC)k^?pG4R5c1 zKR^m@BW@LU4Fi;dGi~;4)LaU~hSEA!R9y#`%gf`~SpGF1!zdDk&N$5twG*O^;D+b9 z?!s=Gw(5>ghParG+b*;a z%`)Z_q4j)f{iU*X6s$v|>%Z-zHup^3V92p!w|>VCUxxYKe&OI&m}8; zQ2?FO7UGx^(Fx-dh318K79FvvMmA;5A?uvtsHKckCf}Ri!Mt|*zJ7g`V*>+}`FiA+ zvpVE90!11~bfPSOeq4A<*!j4yRKPLk)0$=lYYIm?IMU6X$Nw6i@K0CnPgm~SLC2pL zH2mqcDS2L7TrL3oX>c#6}h^<@Z%wdZPPknKv zuCdzbtgLrB`i5$(G*;eksEz7+eQjf{-dSB=>#i7$jg5w}TK%|CV9}D`Z4+SA6c&1+ zB!Q}9-qmt{0C%{r#2LAo0bB?OT@)WH{*%9?sA7|#GxDr)E;{K{@^aAKUyGop>zz}L z{P?c4QpibU@123^8BtE16Xx20jbPUq@L33dDby(K+vBa02*RP~&OzCBB~MYzeY=`A za$Ve#=6IDMNOIS42a8Lr1}?ji!SO)kN$WAWpVcsbIo>HB=XFERk!7(`woT)LmOu1O z@6y(B6}MEC!Xh_<)|VCa(R-`u_uti4*FPw@169g_ia?p1bW8HiI75@=y=s~u z>0?SL)Ki{NR6`s=2W3QCwL-g9NGWAa;M>ml$%z4PG@x`IM6PVp^yG{Qyn@9-H_6h@ zCu%8mt$VI-K`kcv7u2ZaN@)s4g06BJoDX{GMb+4gY~IOb5!^Aa;(4vYymF)t|KyXl zA0vM&JAx_q&J@dprCsDwHWQX|*Uams;b8E_i=^PK&Os19yso>Z+e4S_$JcNH^F}{o;u#2&;4xwQ@2G&2${(=kEJdZDzGUQ z9QL8((dpF67XRCrWs~d>VJvrCjZJGZ^Ajs zy5Y~hy~AqJ5))YThmyMkaaf_yQ~@hrd4uu7U%UY69&H{oQlz2rsQiuh$z?Iw$`m**StYn+#orQbOYotk4m!G8yuIz% zw3E8b8zrV$hM2=r0_Un`8NMxBPq$Ru^c2JP=tO@QuivZOV?i=Y`CCx?SaVo#i+{PUq50MrD{d{&Vv`o9 zlr@&Fu>JHY0)uC;SjYE=-iLSZdVqvc2ZQZ*vbKF^dfv$J-ZkpgLQ1z7pS+~@4Mnyj zEOT3D9HtF9-CnLVI!+g>pEIGkfPuIAhIWsWEF(&PuxXFeH{nmoYk!=>LPbt7>(c3N z`Xx$`g5e8OqztQyDulK`IfE2Jd_9r>W(4|wPF%CS_Y`B5VJ6#jXTwY>TG7Qc=5UHN z(!7XjPJ7RSzvp+*VWPe`@URJ;Pht0HaK%tyODi=$Vy&kZ|BRJcCAqi*T?Q+R&^4~U zIf^HLO4lgzjbbTaM?k0FFDl})YO^(>wp zr>VNLp=X|lVl%XHLb+!iI4E~2b_%ZS89tc8%11l-$YYNt+gg#knzP&rC+wOw!L|Te~t{f23MRK`1@Fo=*1mP2}nUILmNb-ljKY zWjAh-m*Y*QE`Jw?Z2G8l8fPKMXF9rn*&UzY^#!87&{tS-pDnpiaT$+_z>1D1wl)6Ra7^O5mxts*R?D-qe5oQYj{ z_Oq1O3y=H2bZCxUdEs2fMUw?4Jb$me9Q$ot3o{`BlZB$WnVmE&yzUvbOB-f(D$l2= zmMC0gG(JQE`#BXwGvA%Hd}zVbtc7aKjqHrv3N}yrUU4{s<^|%blStCp7<@k^sr1ttaQrk;4vI8w%`_>Zv4}n_SqFiC(D%C zdXkiXfF%07ah0dKCM%Hn#X<3{ZAA|NP1X;^-JUDeHB~*>8aspbjrH_O3b#P9Bvl!@ zM%R2|EB}wCW#QsJZZso%A6Cc>4*zw=%BN3%->Du|OU5H|QQnLx_V9=ojxyD5>(nx% zv5p=%eiw3wtlHaFiY>v;w!w?9!i7gUZ0^AX=a3=Y%Llx;{e>{*6Iov`Qj53`!e zfs5>d#@XNnU}3cqv1=NM~5e)|iqA5M3Y^M9mHne@wawK3KVT z+R6Kvr@imJz}D`U%#Y+z5Zib|R`6#*BK!PSFaO&%`hR~roA4*`^0Wt*rsVSEGz;ME z<*!%T#3OJh{=nLP*L-3{dwE>Vu2<3x&2j1e=!%g0#iasDg1?8${-W@0zAO60r@x_Q@sVjJ~k$GI2Ehm{rZg*LXHDx00}Ap~E+-)(86e8V-B=ax0p zoR*@gGvt3}8OhGbACB0%a|%E+`&U_0O1MrX4`xnerent)sFuQbL$b+}*@?Y5`4s0w z5Vix|Fa;FB%SCouPC{~)XOwwj4~HVS@IG;m>6?XWWxY~cp8 zx3#}{yti|BvR4`C^B$vGt*))CC~4nUtM%$iqpJL+)>x^ptu@wbYqh^rYqeS(zN^j~ zkhCB0bX6BXnYAC93+^xnMLv@FGT$fH#>`kvj5jj;kmDRk+q zSSNo3MKj`|0j-=sldcJt@eS4>{$#mU)s>|;Z=l!jl;)_X?4p1F^XAPD$`3!VYN{W8_(5q6aM8?Ae6`mT z#ZSR@J({jKGp;QD@?B$PZ8AinSm?^y62S1wdqZt(s9K?!0Dj)__Df645RW+!jwv|q zYKd`I#cX#C6=GvCS!{$;^+rRiof@8rX9ZSS@l+NyqK@VheqUnX_cY-ZL+jSx7oUGH zZ@+|4$2p=A=ZHpGj;IG5(Fi!A_O{w!qy6y1vEv(vl`Cd>l+I`{RPc}x@hn%P;SRbu zfb}?l^|Aog0s!j_!1r%!^|!U!M3&tO>ix15NKiu;gZ)SaUE1GDdYq$=ffbF(H;P{%vz_=lFs_Q-Xi1>#GEf)~)GPtr!;|G`xLOn(77gN-*w98ei7p zWG{f%DA}t4*=qsWYj11sGssR1s5`!G_-}dXXXJrX*LfN%VRBpX`p(GGQQ0eWghpYv zOrZBgD6g#-pL%VbP!7a=->nzpYeYG3A4PesgyO8NrJ=kUM|rg*$~OXxS7m>U*XN@N zHe%pyl!WfRfNmoJTnam2G=Q+0+-yXPVyZT0PBLi)hXp{o{7>rV9uM}XI;FT%^tN;}Qz&4g5W>$Ad3J0ot z&vue4z(orq``&gQ?FHO~Elz(cD2pT8f=EqS_}2oG0mdz^7@;jwjCyxfT`i#)S^Eg> z>hFsyMra$(S5`?r-jRqINz0;H!jyFb0yu~*+1!e2AZW`xibl6nTT_dB6s)~GH_;4! zzt!~n?`o_0VDNSV5@=2g@xD0QL0g6(j+=K(drOvEQRPd~(BmAa!y$jjug4HoT#%qG z6JULHLsvV+1(>yuGQmc1If1rIDY&iH%OMxqBdWk~fT>c%&Y-aRvBGw_1@aO;AVpWg zq*WP1X*Cu6f&wN<2n%bU>eGZ0Z`fccG%SD$!0O`ohiPzfmXNKD6#}!izS`I*Xy*`2 z-ae1-H`eo2T8uQ%JjH(&zmM6v0_r(+&>dmq@k>f3rF$Mr$<;s#bazY?4zWaaw4 z7iSc|4{A&j!q-YD(KV(-Yuf7CMiJ8@5YF014pd+3L+ssGA56yu1`lS4 zQTq3-@89wby*RD)5^7P1F^MQ-0y_8j0xV?s6nEyKZPXDJ*8wP>zzh8p?(SgIbB*6eCQg;6SHd@IFjETlW__iE zZsF}?(<|X}G^*)V*cZ-1mpfhhDMMS-XNY*J5s=Y66=Adng0ItRauvq*T3gC(m zz*R{AYnj$ueNbhUE;hi3Bvz2Cs+Y*pKwF|gqrSRcuNP-V-abZy63kdvWeUvkK2%dtFFxlxOf(~bP`tp zS5E+!5P>70A?9cpql4>0_qvId_GS3yLA6X>IRHTccSbjs(W&W<=q1YYpm0=6D2gh} z%Xb><;HY#93kPo>5e|qjiffzo2@4VD##?zK8h(Gx3ZpX3@b>K^`NgQD!P(PC;0|}F zCbwc>VIZ_*(2nQ3YVV6<1lkft*4I|n>z(4B9&ewzQW4KimgJx?9UO4b`?vM?^I`8G zb;@8XmpEMu6?|2Ot(H&R-H}V%XKmWwfYw#8INt<9d|X>E?r}g{qMB|ry4AJfK^ku# z;p2a`;yQjUP1XL1(fML@EoQvdN*b>j7E zy;^LYgsl@(`=~u?l+gMOK={|*m+@LZV*h{7VQXvWxV`ftW90AuS*xwr+5VqKW392; zX#AyGt2XMjKllH<#!q59ZsKPXSfp<#ho)xOo{`sHsHJ+Px(sfqJyPAVQm~;i=FeMwz7G=t!$kfZ?`U5C&z7N_vBo;Z0{^9=R1F= z=O^2jTln=dwc2jAFV0)dOZtJB0>;O18jsuUp zN${t2_7*AFkq16DrbW=l#IMCpMr^B_xSg^yqJ1%{$MXnuY@*FJM|(<**4jtCzOuni z%a~rUjVcb8<0b$DeL8l{Uf)-oM;m|FIl#fSebXOfp0n?`VCr!^-cQ;a;+p23tJ>rc z`ypi|0F0h$DLd440thOO7StNhs22eRpaI(QZunt)e1y4I8X6GlyNxeKEP@~@L;zo?`46e0>*#HTwMQ)jUWbLfGwkqr0E0oX{ki4zZ`M*#&G44Ohdi7gwwQ-x3YyxZ>_S(GmD^K42Yb0AvDB zQ1l30b_^SkpqW6*NbeGyA<2Jloza4_hzrl~m%FeeQ=M+z*3Ab~A7NjvBJ&6Dz<2^^ zP4Woy z@G%G>WoIosSHLb(^_;H%i0tLjfIMCnvPT{9Zdik5A^%;oH{zS!Fhdb2sgD!N*C#<& z?J@ff$bmcOlQT3Yf1ODa1&S{wuxa*y6WEUL$b@C>MH@0*Ml|S$$u2m4CMypoP5at$ z?-NSl5xyjdNe>~Xg(6_uVj6(}Fx2sB4OATz$%ATIwC$A1zoeIzQJW$IYAR+adQbU4=stxlk4!`=-{H zlmQUSckpmHFy4bnq(m;p?YvA*6az5KkM}S|!O1L36YnfY{x7pCfRBC0BB6lS%$|v> z1WB4F^|8=Xf8B`qFDr5MaqJ;Ci*rnm^gSWQH3q5~$ftn|F~}*17n;Vva1DroEYrRx z#C3pMkWVo5SrSB-7K5GcvScFzq$Yqu>=;frr1}=Ba&F^ODIS-BKxC!y0t9k_6Sg#f z13Qb*gm_rzo`~qlVYs2U;CUAC%aTy|V#~E9)V4S3e}L}b%0u`a#9ahAfyYIG1|mJ4 za4Q6r$=u~y3)xYj3?2@T{ElndRu@o_?YtDT_IRwH&q*9nVfH>y%kYwc$JJa1l<_iB zp`%*FM_3CEa750>$QJi)qZG(UH$p@qo_sHI4*CIYaGog&beB8^{6B;VG@@zY%N8EU zU6xH&f8YvvW6w7Ro~*(tdPNgLS2l|ljQnW%n70!6S~Aj?B{dS^0twrQH}G+_5z9)` zh_tCtxRKYS@j}yNJP9O3=PLLSSKx=HHgZND2rq7bL)GVo-jQ&*4A1P@DnDm{G$O>N zaw6>`J9co#lq{>2g`^0_{Oe%aLINkcJTd}Ne?JalgDQOhregp3wuF>I@#E&VWdPUhow+e^d3Z^eSE2TYR#+CDGYA_>-nXHu!u#$>| zAO%$jz)W5o`32w{!YskV8yZ*{La-mGK1+Wz(bupY+)qxrj`4^6~^g6h}MVF8X<31Plw*e=qwlXcWiw8DRoFz#V1o6_T0}GeZv^hcl5}=)-?WHm3{%)XS@0LV zB?yBZ+u#-v)E{^xa*YhrjlUo!#3Ed7Z2^4d7p&|n3=wd;7^TSAyZXR=1&i~yCD zV8DkyK};*=DLA$(ivag{s2%pBg~S<)X$g7^$W!$(F^$uTa-wjVL@>%FMFbk5jB%4E zyeeiLP(+b>f>%^eIBYuZBjd~$e_)rNg43BQSg9!IhMXCy(9n3Rd7#PgI(ZFvfu*lJ{nVIkmO|~3{LWGczwFZX4sN8jM`wX-1LU(-- zc6L!+Vl%};B0Yo`!DI0Tkky1K+P)WYeS_!_e-aZ_$v(s*i66;~iZMIVf0!(B6S~qE zM`8TVk~%K35LS?~kxy9k=t;xV&BubJu}^jwQfCv#exf65(#WpigMcjyzgY_5DLMd% z;**mG4h9SvVwozj2G((zbN4c;McqKZX<2e6h(-NS-1yvB3L*ubxJt#J&~szjQ}jW= z@#6}(rBcNyI$YvhKQvryeO*!pN7+|~%k2*twUKS9p8P9p@1BnBSMNE0T? zR^i!lzB@b4e+)5M>lUdf3Zn{gTPa!39DrEjOCkk!!sj7_j43&@OFOb9FE_=54^w+7 zOGd04X|2fVra-eCiVfA`w#ONvh@71ZM2Y&tp`~nI2tZ=Be=1^y1Fsu%$>d5SA4SqK zL8KCk1R?}krC^7z1h7~&^a8z#a>K{7)UcQ{G}eH1(G1YF^+qYQZh?QV`ZkU zLQfw@j3;uKtJjgU&t*b0?q(5~62q`AnCq&G)kpUJvE$=Q!Rig!myW}NG8Ee$g?DI1 z2sCd5=D;&_e}gRqp%_Rc;R7-6f+a`+i$O@#gP4vOf6OI>A~NI2&?FU4iZ?)rYxGo? ztt-W2555+#2C7gvARekk$&c0@(wshXxuq2$L_A+mWA2Ms#=uH2l1GDCFT;JnoId}E z`&$?fv&MpH1;m0=!Z0=1u->Kls2lJ0&^eA*XqAoYms|(}P&;E5z*6LmAy%jch>AL^^d+)j z%OSzI?0X@oiwG+w4dNlH+#1uD5#lb1H3a<5w#`zMzd%Jt^? z`R4IO5NoHcoSe(c@+Z5>=JBoabCcLSCx5(XT^#N#1J;kKHLjE|W!Xm01D^<|E7Y~=k!JTC&3_ES zWTw>lIxA&k<%QN{Fw1!FeFZ)Xl;TT=rrI$rT0C!|Vo@m#vwj6%TARt{TS!UBc!l&@m(SjcIdYN_th!7%b+l zi3_N3+Lpr@w&yrH7Wk2JhxcHVo#9aJ(FXIuaD;$&Rnr=|%o?dycVvgo4SyNIl${{B z3V_Tj=cKP-VkN}PZvAKbF&m>@@qHNN6VZ?&a zyg2e^Xs9KjxbCCt9u?R4VqxxboA5%lzT>bgC}lb$i|v$i1;4FpkUm-FCz`P)3!B7{ zr9rv&qs{(c7;W5I5+=kLT7NA8yW(^#o`oX6u58 z#6rmcVT4bq<8Xeoqs6wQ)sVpF=F1`~yI_vKMnxK`QG%B|op2Q;)aYTRNMZw?6ULay z>@xj~0?*`~aMKNNqZ?faSJ)fi8S5#jbJZP?CKAqdfW=UpN3I*LmVfcgF>a)$N;y1< zx}3}#cgEb=2q!c~41_ohocTwI8zr|ffQ2#e&ha+d)wFGJ^nCO56q>YdJ|GDxTL2n$ z%(pMdTler8f$|uvCBe@{!55bKHi~FALAccpNR10&xG%CA%V8wnH4RJm6fh7L710I^ zb#Rr^0M1U?$S4JnEAo>58(r?bzQ3`voK!6`lWeNug++!c<=G z23-6A4sqX0Xtt%bS(FuT4Ep>jSO}${o&f-Q0$#K{T%cmDd7e~gacax>2Dl78Ru*=V zn>iH5SS+o|x6sfEser`87Z<3WA)P?&8B{7Gy7I|4zaW^vcz&2Zj9dmA=$1W1zoP%^J zpo;R=vbdk8j#MMkT!&uv_5&C}B##=};<7jpXwL zm#e;zg-QES`F|$qw*WG|QpA1Fa!mM!H0(yow_U(Ki=fIiU?J_{ks$ z2_T;b7z(Cl_eOZupof*L?fAAoo=ORwc`rGy%Gcic{O1q;i2eU8YJHh8a`*pNtF_u{ zV*h`=y87q-|JV4zgD-F9rTM@1Wd8gq{UhZ6d}nj}Xn*GgivRv)qWrI}tS97ub^Xut zKdy^5ws_R;h%E<(0>AEvpj?9?T`HKd+Dx=1*ueY@;!(> z4A&%CxA?UJ4&AK~YiHUh;%rC3kvhz8kn%ogvcy$x3x)@t&RYCZIr?_J!Vb@5Jd9sZ zBHt{`lmfr{0F>oHTgHa%>_9wpV((y4iX@!2v#VMbKOnfJ(v90~P<2{At!-<-)=W3; zaev<9^Wf5}%qFOy)1F`2sKyQ*&}})-Pv!gaVr{@AIM#!402<{;U?$eY%U~+@{qe}M zw)%#4pVGOHIaK1hoi=){(Ocltj}A;Q@gyPlz(OTe7CWw8*IfoNJoL?s`POGpzXNE>t8}4 z^gl?+J1sDn6&>(2w=r_{f33E@x+?4cRnY$pkhDMb|7-lP9oNdgmEfwCWreO8gV1l+ zH4R$_ZvDb``Fx*tDcScwzIpe<4{wwolpS2b>9TiB!xgv0;kKUeB01*G1&6UJ@PFdF zH>?1?RLxQhZBmZPhd(_D9A=tmRQ<Y2)@U$I&}uqawchzx=*GWm7y-I+(2k1L;?f6xAjcr+|4`mXo@NkF#0R(|=5z=zNYp5lV&1O8YMUoUIU=hW($ z8u51_@J>vYt8`E&d^@e&dD`?-8!-57KrVm6&YmIcnWPvq@It@>x}?Ir9HCc$lXG!Y ziuRR-*AKGn?W4oKf^H*7Vt#}X)_`Ma^`>b0*Bf z__72mOP(uz;7TWzEpbU?;qME0N)iLSfCi};XNca^^#HkXq{pyHHDW@B!e`;NURlum zPzstOb|1+&6QmTXo4B%>D`914kfS=%v_iVHaU^WYqJRm01=W-lus{)ExSS*lv1#(I zBOESsSM>Q(jAXXK&pU*0FD|@g1%iK;vPpN0uNeVwmqq9{1AP)gP?BiDlrMc;kTv;c z35{J(hJ^^k)i~1SziG1%ZaNe1N)(aQ${em9j%bS*i)co!PkY~GDs0IsE(N`R`LzH9C2u&L1cK-;4Te09&!B%#iA#Rv zR|{VEn>rb(E-ME&1R|nb@Fz=9*&TwRl%#NKCSOi*e`M-JsKi-1XU1+*1OSw*iyY-1 z@rSqjNvSR;`pCJ7G2Tts^e3ejJo&d)?xLkj>H%l?^D}{?97KrNh6!I5Nsb#5I1yEo?j&$!3#-HpR zo+f}~Ex6Z5w-n%H=#OAW+oRaR5j2GFnAr`l0Wk+m331wvGu=dK3d<7IW$=9(me41O z3iAZ%p-k8S-}E?A`Hl6|`M;v-Y@j}wgV7-VDCBD;%uVn!u~-rWH+6r|(Lmg*W&4c1 z#pXlj(W6~exB)lcI&4$`v7DI{o%sLFODyU?VlU@WI#c;fo z;6gg6BqJu)Cp^kx;7z<>hHo*J6pC2?z%8{QO2yH7zIP-TAnIvS(<5~#CzgM4hQbW| z8q*A4Qed*2UUKw_V;+Axy;$Ed9C6+g%)=N*9BI*HR+k2Xm(uuHhF90U@Zui6$dyA6 zVAaKlp$8NB;Fx-%V;=sPe6N3$_i+bOYNQWpqFDFms_A8SP0A^z*qz5>Ju~M&rR#W3 zg4~02;CNEQkN7$nJdojsNZsx5%1=~lE4UMeZRDfvnn=O0;2nP}ge8wf&$xCR1215p z{GTvD{SPw$+0!uk9Jyj&w=JmwJeS`Ubp)4^lf1;nG%-1-B$Dt;PJpKZZS`Y%YB?kS z`+0uZ-wFBOwOYNt9?$>QSJ&!)=6_$~X92fX@>Q50->?b*6~=RduNRrQ^p=%{-+nVZ zzLc}9{96PjxH5mEd;tse?w#U$7TDzvy28NJegii9tp+|U-!i$lkd{)$ z4WQHI3-j}WF)%8HEcw?>@KI)ONwS%A5KuVF_=9Guf?)iFz{I|H>3dgv|3%JgJ%5ry~j3Zqc`xc??uNVbL@Xr;@JNwj=~>{Wg?5F9(x8i zBWY6-*r_lz`}Y7X>viG|5z-|Sun3z ze!f4tWI@<^5g$kRL;UUrzLGmQPK-`F@V$m(a97GPt&e6y;Ckuwog7No1|6e#-J~%IaB6;z`4?W?(0Ojd-!33_>Z1jE#B%Gp_IsYSFmY#Wut& zRwdw23oYVnVaYc!a9m$V9Ye&sh#!BK>9wUao6AiMwo1Cd$P+&yXZ$#ErElt`y>EJ* zjuz-92ZjX3PXtZu2?FpFb~0DasHJg+iCX+e`1OxqXzpq$fB(Cg!zCjA=ByITs64+g zvi&5o>@Txe_{UovETeX2Tk4ab2v{((+(&jIXYjl=z5LD(;Z3e}Tvr{-Q)GYG`-%Ss z3nqiWGSc!|v}jq0eEF}mFFydsM**5FJaPwdK^Du10SNL!xGci+SXh+Vf<~8@hZetw zPv0*GYCM?Sa^Bonzk$mV2X)4!$_W5NI}UK5QRV{m^ednf0ETuPU{YA~fws)5YCd?- zgoDTW4B^X0Re|-`9P1;;o3ej~&l+WJ%cT+w@Xq3234+LCZbojQnq#Aqoh0*~5sW*- zWhKEk2v1Zu{Oxa?plt5{jH-?}pow5Pv`GKw-_*kwa*7QsHWS_ZzyoN}b0m5WXN$HU zZzchqmDKmYI72CEL%7AZaUl8osoFc>&P2z!#04*=0tMe!h9j@f#U+0&lP=6gPCKs6 zBV-HR4asc(B-wCW_xz6E(gKhU!HKv$Km18oef0w`2ZKYu!;`f?qNB66vTTeG>UTE> z&+7HYsP)--KHNGOsMk*x{B7RWcfH%jm3Mn{{-BwwziZ=`*Rqcv^qYgvcUK1woyM7Y zVzx|p=eg6k8sFBho?CyPhn?2oxZl}3u66cytDQz`r0*Y@H|E3qNnG_bpGao;S}fn!6`e{Ql_a{K8v5 zukP-iKl{zI%j4GJPOW)%bG&u9chx+**0&CKkDF&#JDzcQ0Kb2a*4xle=l*Q{PpG>7A(!<`L;*8_N)Z9ac_u4m(? zL-_7cd^forgBxjbR6UB$AMtgyL-TK&eEtHalzuPZyNiGJ6TG{7!22a!bDD5m@6cGr zPB0eqar`sl=<@!|Q>zEfOT;74<9s`Xuda89&X?n-3utrBczR3E(y z1wo`zv`^Q`G`}xe2`TA*F>Sq^tp60;tx+Czqi?ou*y9;Ck zzN`5?{HoQUbwszbA@N; z7o<}FFNp6;A;Xf)ckYvX*ald2fW19|4~gFcK7<24uNjk3P$YlPo_BX*{6THme0yR% z8|}wkRUYH0CiB^ZIdD9%@3`J)GP0*5&)N~5eb%=Vy7;EK1+X;$j)$}RESkc**B00+ zv^^wu&*$66TgVUk&iM{~A3oF`TNFE)0-OP4tJ&(^l|8RTAz$%2)s zldsU;w^R8Z`QrD0_kh1HL!P-Ko?$vI$}^mn#4{H@@*#i7W{cU=F{6=m2ZR;$hajE=f0C z1a`(JJJWwgertgLxZOvXU4Z$CWWI5?E%_d(r*7c+P{=9p0QGkWzfWq+CS5XlMwsuI zZLHlQ-(7%hxB}R(+X26jETazn8Ry&fw}{8b8(W9_SG&xox)7mqpLpniWlhq0_}u6yA9+V9*}97+A$q7Dvu z2ld&Lj4PB+@63E$5pn@IxB>XcJ_}qUe}O(koqH4Ls;i#YAv>*+Y+Y|X`Pc`*eGV}0 z993Jnc9i__Hn*dp{zd)>=mT^+?T~+n{+_?f{gd6p?SnnQ?fCpN^T*)#Iq9v8IN{QA z;xvE03jF1(`)GR@;{t3)nh$iii!@_=cx4LSX0n0vxf1-&{Ho)Kj6{6^>O)1Jf$614 zUukxnwI@D?mH0Sn_hor!JmrM;HtOFYZ%y#;`iw4B zVHY_MMfDo_1UCme7$2g2ZHM+1bp7tr8N+|~4bA0>#dB9oZctC>_=3j)j@qV-)Au-M z#;<|z-IIO)QvuU7yl^`%#|v757t&&piF#hL*HNB{y({t2!FDPiaoakXk0Rr9nS=2g z{cYwGrrI;2t-8}n_~D%$z&GLyc;XCo#?=+@guhSzO_lqYF#c_uWcWtJ45**41fGBP ze5T(>KU|XUMLt_K!c%ulk6vvNoT$4q^v7*2sy|?C(owhMlY)P25s zNH>W_7ZD%I+=$1hoX0t>EuP|{#jq+vl#z#UuDuZBBD{~XO=7xLiaXj#S-)la@bS!(u2dU;Qkomd^eK~R7PBOB zF4sF;FUI{ui)?mu>DaD5TP6JdVpd>`PqDd$u@ zimcz9)i*}^-qlFoYOP(5TMvihW>u>{4LkPP+TEV@e0zQ1-CaG6)a%+~r*Tki?R&k8 zM$^&;yH#96I^1er-(Ek}?%I#N3;W8y9bAp!yMuH4V0d@Edf(ZDPs3YN*E-hI=y2@(ezUjI``K*n>VvCMYwvEXUSEyw z_MV1!H?7`n{i&}tjxBB6gm+hZ1lQh`4`Tsr=Z<=F1mCSz?`{qTx7WwkA@teWavpB> zRxM+{`JmZnk>{-)Yfl?kR%dYT!8qgA-qi}?<8J?dsMo#>#$Ijh`&!4`?6tNwAAUB6 z;%|iW;`ZjgcURwdxZ68ey=$+^&o;HeRaL(^7y-P^)}H>*sh^w1^=0pN@MOU}hMj>n z!ueu*1}FPF?5{UGF`Li&{sFXQIAU$z|Ne9E_vY`d-Q&Iic)qxUKxz_>Dz<0F1*jyKL6=QN7^e#i3!TTFkbr0yW&--dONBVWm1YVHw z);rsWdF@|~JN8lUtlb>nBJb6!y^i2X30H@IHU2m8#F_K+g%h*`KG}eO*>jS3;*#U! zybhml4*EK@kMK|K{2!D21u%9&)?i+O$AGTz9?VUHF?8q?dA=jbUu$0<>U+JOzOO&D z_BI|74jA(}jqgF0k>35=#u=9*z}3JS0Z**TGA+*``n~0Adrwy9n!!>~KDI#y05?~E z&#k?k)bXNpZ1&-M;Ik(O=znx~eOEoa?!%nUdRpDOziY!>fFF>)sqgI{;CpTLT6grV znuG0H`^Uq(y-R_&(cNwuFC0H~?Bl9tUwuY8{tP(3y$0G1U~UM@v(vj8?0Wk3rPq?5 z;dtS*p@awer!}sCCN1DG@qLr=7yH|Pxx0SyI^$mQJuU;FGh3_;@Jk!y0sgi2P-b_> zhQP(m`LI)88MStG2maP>w)E%LzV)DkzN9tyi}&`4nCE^iP1Y|}z|YNA%Y}cSn;4A* zKk0kcL&qeT314?NeP#>xj=kHP=IKo7*p`0nPsrVUnl`d)vijaNN&|7fH${PunZ`=o+hI<%3_t97zH>A0JDDRx`j{-V58oe8ZcApO|bV{HW$F`X__k&)}0rWdF9l0e;!W^WF6s(gJ$9d;Rt{2Jnyh z(z0FWetaVS$kP=&A9#*5b`kR<89%hoA1+}$)MH357<(1;*(mzHZ2=uuPhkE&=oBgD zO423pKSB52-2iRtw>|XN?*`Ti@`}Fq9^=i=pdZk89Re=Ee>=B;W(bFMx3xKn%K2)% z?}wCQ}yR};@KL@~zzIQh?&~M*A zhu8vq!aC?zz^Qsowk8-K`7TDc!t}b^yZQ`xW_)4+Pc_a5>P;Ww`^}BkuGc$g)HZIe zs((K5hCTrApM&^iJwEST8zgKv=z-gMulMsl_t&B_nDBF?cRzzZv9k5a zswBI}AKaG&pVGK~vJUUT-VJK~&UT!aqyGZGio+LwnY+0f@lm6EApP4r?rRYLOFF}f zm0V{F)`_BXzI=`lM$cjPJv^2=f-0FTmUq=(s5THr)UR znR2)Kdk1XV&s&-u#;ge#0j9e?+Pn#KsjB-25Bj(XIM;gTHwWWRqvhO!uc_8oA9Roj z!7C7dqZ3U}WWPUx!>f(kt@||o+lcDNTADAPZhN!sSP^^0?L_n8&W!8uCdA(7k2>f9 z@)ffAJ73rD1vw}S^HXv^DLfYQgF?LpejAgMEs^ijqVjLX^)vf-0kC(jcfG^ir?{@- zHpJ=4e2p|@aum~v@p&=2?S%H@Jc5VrRk_%I2jrx$$t+RhV#5|So%Ymn} za~HeEwN6{|TVnp0EZ0dMS^67yE}`Ew8>UHN)zyV|?1 zRU`c$j+>Vk)$>!#*@8|4zj1d2KKd%j&fY-{aE`vk3CziX`B7f5v-gO&0h!Z;J+h2{ zy<8zlw0r@4T#SUAZ}vuU9+xU@APiA4*J@D(=#B}Lcajy)VjSs zTWjqN`}$yK1hxryV6{nkdYgQ!T@CzF4eZR_{uS6Y>obeNjv;ox%7`UX;^X{W8u1!;dvM#h8k1>X9e<7Z#t~oHO5_5v)+Bb0F&{wd2jDNB zbs9Rx&XJsDdhYjtY%R@&|BXJWF3l}H_uE8U!*T^YpHFcQ^82;$V*~xLniltvj|O^G zhj<5VmFzR!4tAgKF0%5#F!uC$;8flX^CmIA0^O!_zJfN9yao9FWNXD*+|S!PF`uS6 zfPZ=QerA0PkuQ(7y`I|Md@p&bqLjz8?aqSU&7+SZX{($cT8wzca_n{4=!NvQv zVC^f&L)7}lo&~XgEwxP|PrS3!i=MG-Hh(~Wd{(!b5N9H6yF*;R0$Cy2vNcVvqfn=A zL0rH0^q`|YzCOQax<47q$JXRntT2ww_l0FWHr9rz4z51yTd}oK(4&|?(m3wh*Q@B~ z!yK(O!OvQR&Z%pf@f;+`(8icK089#(%iE zk!Z`;j}m;-hB%h@b2vymdzbTUt+l-w%at+tWU>YQ?yXv&?@su7sG|z}al00mH!h3* z?M*)gwm2`R>8W%-hu|6D9)c#z!M0QB6vX^YzJ;#5%HgS<9{8V+Ooun)wuAZdv z$x)`wWpBe~dAMC%D@e%`CVWGY>q+L-`Fj`GXXsl19d=hwIsH##JRM(WXZBUly(;o3 zJ@f;?RzD*zi#-*$N!^-BU!d6vw}bBhPkg=pAO|<#6YZ1U5NrG7Gn2h18-H^E@lTNF z$*1KW`B!{RDqPo3=AF4LfgY80+|OG&*!wfg5tB_jgXcd-sSuw@aOh@>iSAt#>9G)M){fYx)RsCQr0-K=?LvZI*Rq0$eaq(iuq%!f=8oy z)71SmI{K86b_LdFm>-+A&Xdp+S1Y%a7iIAP@`=XQ(yE{rVUD}FUVriVwtn@fGksF) z3@BEoSPf&@3?CxEw+=QG^y*pAFZy(Bf5UrOE?VFRTmt{)>b2c)PZIcAPAJ74>6fu0sy*%uT0t!(=%z$HclUk6D8C=(ryeUr$KT zl+DW`-vV<0tBE|j+wKN*hpP?ruYnJ(JIsrv*w}Et13csQx_iADkJS?E z5G;T3G{kj+({^+{IrLeY9l*POlEwqq^lnBx7xc?)AIRnH&42xSj+ejxoSuKpg@Jq% zc&=~f#(ti9b6h>Nn>DT83v_JKALq1^{k-ba!`*oGQNKBMge}PMdxJbo+L}ATW7Rgk z_O%%QGe430UmUy=UbQvj74QFES!vYjiThvH*BgJ{|MD6?@7}#r{^1&3!!>~J?2eS{uKaba${$?x zO|RwcVZ})Lx)xr|9T|vK50-}6#Cpb?3#^wWerWO!TlisXLB2&1FF2#>mb{p|7uHh4 zGM`i?7pH+$ByntZEhwU(LS;@p!}kr>V?}o#RLj&=-*`ipKhWi)yzVd6kAKIDNV}p? zoS|V~*f$m6WHrm^E`dkWi(U#JyNQ}3md{pPbk%VjORAZO9}P7q!}dXZ5xpIYRhE`s zV_$@C$v2dWmsr6<=_U3>_)^+ET!Q(C7;Tbttum zPhs=0?%FT+##p*;?^uHKOMmRzFf7R?bx5D%Xc5JSRa<%lAA)Z;qi?}C(kn-WU<|tB z0FGGQ_wY^rMdWF0T>h;Xn|~}eex&;V22&;nFHim-QIGRK9I?_haMF7**d|r#7QHTo z(8JfoU|$U22q0t6mLk(}xE2ny(7!%NN+rq{h8?L)iXTHjWR>@0P=9ohUBo9fyh`3> zjE|2DzwZPWAcg=eMWIP3L8cWB+U(-8L%^P^S{KeS;O{|P+sn!`@@IHeUPkjR?5pe; z^irUWoZ)6%Z8*bb%7vy^hHG~DRf9~TmB0w&t&=uh$2`PqmvyW|j<+$9;osaQE5*;t4h8FZ^}X!j_x35;AKvVBK+V6>rMymli(AJ+695VI=5 zoinlWwe*y{94=d%qTwREQWL-~V+VCHCHmC(7c&Qu>o3Fpwtv|r8HOJ1@L$m$|5c{T z07TT+tW)gsU!;43cQUXlUfv1|P>W9D_bAH~|1t5X9u*q-k$@l6*U09@U0Ex+>~%rB z%AG7_PAfq3?DP7UWFTVTMOTMg6vYu;Y6`Foz#;qx zL%=_|$pXoAK_fyFEUGVEJ3FEIh2vy)D(Qg(2nh)WPg#h(ybzId24%fSkK}1{t-(4* zt+>E?SWr~Ngm`Y+I>Z~Ak8u<$UeB+zFoL@$P5Z&Q2Y)wBd0^P%uU6PNCRPVu&@nJG zkZcIqf&z}kNM#`t^(y)rfLrV_JA~kLRP7$#M~-oPrRN}@fl35pq&}!7MS6-k7#O-4 z+^dF6EP7MBU>xz5u!W$Jx1eZa&HDe@d)Mwnl4DWyeD<%vz4yA^ecaaY5Zz7p)$tJs z5J;frRewCZyk>wxfG8d#UIOp=?>8bNGb=MIt3W+%d+)p4YuO{Jvhoob5gD(HFso0q zr8Dhu#Gw}oNFbBVgTLpexqTxFu}06OHJ3Jw!%Mui%kttaL)*}~?$lx5Efm~T`-081 zYZ>#U3r7z-+a4a9ek&muaS2Z42!dAr}_Bn_S>(J^!X=QfD)HQn- zJDSTwcneyn*5Hga>g|pB^n-l(+T7y(Ge~dOA?2z=ut~$DZ(jc}eqI9Ovn%Qtn91nndTmq_+!fo zv;eEx@Y>(LEG|UxHB20fAj*mz#51ucxn$tW!2KTKkc|@14SSTVr^$bR39(xRWrLHS za77OR-NY(1iFn)u_;lR>!9ae2eTMd?SbtH@Q;`bG=aPVkSSCmbm66yNoQ>S1ua*Y> z#MG7sK7~%F_&geIVArp=W89vRfc1b`t;E}N5#~BZkmrZ8%Osw)D2qvTFsX&M`4T6D zj6_CIDJf~DQcFcntd*%0sb8>q2h;hK>9@jKXOwzC`vhxtEWDLz)Rh12XM~H|!rgrh(y74Mv z4Y4j7ii#Yq(Kw6tSbZjFoqguh4u3RN7Ol^f&#Ad&EyAa$!Oaj-Xe`c3zJ&P>6g==L zO>!M<9#C&IF$g;&15;2|YNN1VzC3@pJW}{tt#%tdugB%`rB>s*4CEr_fZ}o zLHSuB4bJkoEt>XZIlxkE9Df1uV3$rrg9Z4m72jPEW{To6EFX{L5I!CXb{xUA>715r zo9LI4^JZQuDypM_N_u&gP1zz`o9KhS;7*5xs)id&uAFK>2XI1Ghr_p6i;DhWLMyWp zfTX%zkEHXC8(WEilk@JEU;d-NW=Huizl4{O0}P_R1&IFoxA$SQVSi^J(`osiBQ6ee zcOUZ}aU+79$vd(X;QL>Gp`m{H1?8FD6zdY9H9|~>RTKsJ^}Sgnj|mQIUV?li)D9Ym zJ2cUp;!nbmJO~Wp3>TOUOQ(*NrTc$|+Z;APkHY{L*7#wN?dt3@Xo*_8%OTZ$U$g$X zrN;mSE7r%#PV%aKtbaTuECC_6MAe8iEBK*v1L~9hBTN?1MF=Cq1HiYOsBa>tY!_1b zO9?1oOX#0w^L!KNm04o@xV>{&44nH*hUb9ee;)Q%>*%ht*LC!vCsUUZ{i2>H`yB!h zyj*`hithNhTmp~OBvuuCe>3c*I=A4R{XAte7>@pO1}Mi&bAQn%B|iAy!RBkFxxNH3 z=of*vU)8suKrq12J6)VLVZa(bAagb3%`hFYzw6gW>(MjFf$in9G|lw~0IU9RqqEjN ztGBB^Ay#wIahR(8h=knuGAks_5)u&P8a0(G#-%#t~~UXePgPR=3zHpZj6~uAC2GA1Qd9_ zH1|^A;nM755opLo3jMLS#M0^NlLZrtjAx_0@nGv2@Ze!^)`Q)AxZJSt72`2%>2#<+ zqti}*hE=MKwGl~~&z`5l&Ev{=O2u5YM<9NhD2%2*kbguL)1x^{EOKW)0g=V>$ZYo9 z2T^=vZVQ}aBlC%YRQQ+q#DfK!1hAjLqtlkZ1Drn#D+5^=!}QnY?;tPf3uC_WXy2cj z94E+J>^#BF0L%vl>Ww^;f-JPps+gZc!X~|I7ji5TdK3~1r@pWT=@9X$7+4}VeCYiQr#&F`tT&B)egC5qYB11P98 zCd|zn#omdZ7n_&Odm=#ORm<(#JNOd5usOY9M*R=6lRxS{*vEC9S>!y;dq^-2x?$11 zfnZtlhz|ejGX{<|y476h@D0vKLZo8V@+XS)F4q?;V1!st``vr812U`Ra{Y$3h4w3G z1%D*-&iWhw_zT;Va^pfg2#k(aBi7}`6D(}_d{}LkZ+Q2JDI)w8Fk#Y9razLYnU-RK z%*TGx?I+`z%Ty+n7-c@EE+2=9J6WdlRyhZ}tV@W?(FRzCUNH&%Z9?_6wJ3Y)rISYtFY zW}1qaX7M+)EM3)2>rjDO>z zd>bF*zbyPq#-!L5?FX#LFH4K6c!*|O)3@aB4I^DeE7L5i_`njA5lxbAh+L2UUXE3xRWCoVE13`0;9J z6d^;x+U}|vIsx&I8`rsMBFy>82CVyJs3Y0)* z6Yf_2U)gTZVy!v6Rr%~BAXxWEUbddZYJ4oy|Z`o zA*>4k@2eN5qls$Nes33;GzjQ%c~Rza^s2y*^}8SrybxV9GL_Ef$ zF#1=%iHPY|so-bkn^A2^3~AP|hV0-$Eu_pT zZ;^$bb&CyNqw@MwINX=pjqtW!qqot(Rv#r@(d?bFM`GJ9E-p5V0r`lO6!0@OHUOX0ED6kkJvIvjc)teOQ6+W5ykC~w)mhxT%}0Q3r=Z;YOI z)1jtmYLQpszJDTW^uyH_?~iRT-jRI4Xl~f_*E6Z(J9veY&-sH4bc6BdIIq}YxqXg3 zBSBz)JEbwxy0N?YXuf+7s+&Nm;2UwANzCcTE>&}Z^V_K_(i&y z{SZsw|0RoA(Lp+qgbvR5UVQi=mcswL^t(vJlb5k~iGR~wXkUMbvH5(&|NDgh_u20; z8Nd7-dzU=jV|KLJkKnX|{@9);pgY8h1p5!1+6?zax0mq@K%N=jBZZib7-#`$r!z!htuH;S7|4t>u9_V z?OLOse=7FFE@;?Km<)IwO#|pVf-?&kHRJgra(`xpHb%ODh?cw9fVls2tiRdxhZDN4 z$ncfV7q27Wfp8JaEuZmRS)w$FCSHAjIdrWUcLU4#9M@@BeEkhR{!3_l>y1xD`^kuf z<=`@|m1W==7R!odh?pgI#w|vhKf^f((+ZmvdKw+n0{Db8;y>kl9SD5wf^$cPh(j5c5pFV&VN!3kUve=YhW5b zrI;Nu)cDR;!AFy0F`RyQG%eAJdCb!OOUycJyV7iHX^yhq4u^n~r|)M30D8J7PJjJU zt1(-=S21}B=dHk3;b!yoGi0>8X`kWu&)3C#wHXfYGHlHC*uQTZ;!30JBAi?L{Q@=Z zrq9a-i$dI?Y(FslXl5AGlNivh+=Ur4>1GLbufmh`;D^O1Qjv=MxVc|iJ~m<@7-vzx zmA#Mr^XHdlSP(qcfTvVU%-)@KoB?DSDc%vA(5_Gh$w=D_v)`f4`PExyJw zaMJ(kOiKSV|AplLdirtMzoPShCDZA|Wg?LOD}DLz{9pf+e{WDhqG+=>U;jY%qzmGE z@}ez~H0Vlie*Ss1Ca>?C53#=sb1lkcvESe*`01zEX6*sD`QlF3$k_hC&VLTZU4KSr z{m+1AKPQy5T5oL0zTQAr^x@-LZTqmwZiTVzI`)`-pcT43v3O7*S@^}c@V!N4o z`W*3z|9(JWIcjb&B^ZHTzLl+?d4LEsr;ab^O8)fm@a}PaAznj!IH-&yI`1C03yOb# zr@nYEQhh1U{;K_Wqa+)9^M5x?H-`VGJ^gyB3oSJn>m(7UZuB=NJ5o}a@oo~V8}&Kx z@Aujop#jIb3+?fL{a5Ur^~F`}@4vn0P;4j}gA^G0j|Bw%Cx3l&%_ax``5JhYrB_+Y zs~o+`(F*)G%KVjw>g=_)H241*dD*Oq*fjr-65IeBflG?=5!!_>WPidoSUl62zN(*) z2&R9r_OrFYH*e{x30uZn?OW1K^>3A=ZAc7SdjgHxT4rm5wu{l8h3&k1uYH6m+4PTO z&NjB2T4R~!NVFB{+Ja4)NnCI2Cu4)=;?}MI*2uFK(nd)cW(>+&*fOWtdI}~_3oe1B zC|jG~DLK>F?k$&Z1Al#+`O)k%&=a89RwL7t!Aq4#Tqqnz4b2$?6&M)PkCDM)*We{|*SE%_K_bAQplg_G9KoGPw$ zt))2(U8+KG=3(G_zEWx@~Jv(FQS_4@f{eQI@J)FH(`tIDdiq@fP z)mfNzt!i4y(3KjgDE)P6Uk6qRge~kSATJMRm^0+jTkgr6^3%u5)aT@! z9N!9BH3erVXn&2gojz!_ug^vxg2tI}Sj0s0&_${zly#9x-q6rB>X}CUC92>4V^)Ym zM66CZQ>}~Ba+roL&&+)4FHry9y2L-S)9YfoRx%~NKX?0B{}Joc!~p9G)hwH#3p7%A z`s>ra4lFNlt|~KNJ+NCyvEYaJ53k+n2eG1vd^yonQ-3y2HC7IIy{Qj|uiA5NwhuNA zY*T4Lo8PiZ8P#VT zF^|VEGJ8JW(rgT$rz?@}2IPCZTEKis!maRb^!SMBMRz0bK+!iSw4)7RBJ6(swH7b+ z{vy^M#eeqw1t}qPR}cDjMVtGlwwmyN&DKAv)ROb zE$EEd(x9PJ=H}WTnArB8naNg#oQI+<)5jGR5q}l#clZX{^MC;3Gv0ITPmC>I7_9L( z6UWvfKk{#{TF99xbI)JTY;?d8xPS(~)}o8>#lc%l%JjF_EYioXupPY$+iO7$|DDqJ z((MLHxT*pQ-+fhoCAD8Eb^vS_%n!1Uwo=h@$r>t#Z19b zX_kH4a8xVRSRCCOS&xS&vMN)SVUb%oD1ZB~i|+(sCBt$e{vH)+rX?GBc;UJA8|!3ljSDjVB4RfW?wGl1`bNq)AdTo(GfvVT#f zAlUF^)!{A`^cwz|<=vBxA^ikU5=N~sM1N#Cy3o&az=t zi;bCZ{QG)Z+j@El2oic9FBS%EWH|qxxftosZFG&{$eL6dnesfa3>~urhOnq?=phSI zdbITvOoJZMk4Y)oxuD=TvRiW43R!6_F+$6!ZX4+>WxErdy)_X*@4ybi5Py0Mz%n#P zd!WbVsjfm2xQ9Se>rU^6<#Z1--l|R2Oz%OV+MJ`$zb)+e%EF@s_l`~uPjqEV5r4j# zK4s70KmTuxefc%^r$0>tCRQG6g2pnG{B6Pt&j@cEe_XexPtUhn(8}zI?9H{I4TE$X zGQ7P1-c>?J7pv`h@-Ad$R)6cc6*OG3xIh;a{7?CiFPGW_O}pD6$QLgkVpAq#ynxU< z{SY%au$r0w2k$K3A7jN0b1To=FKc-Kn;;%%5+}S=`>@psIO}7dy28liDvXe%o~>0G zpfRa}fK821XU$_`Ev$6EeD>V8!Aa_4U73ju&o4n>8T6Osu8T=3cb_DgUY z+6Y(LfM5TaRScra7Fg>M1lX;71Irle1r2_aJL#7w2x0H?%L~5oc%e^|%PiFlPIeZ% zx?+3Vky`V%6zk80dj{lmfjfVE>r=lbS%#HRc-^QW z-573=1xw&fpIpAi6@Q{ZDd1aB-wH6lvYdluxhB=IV1aw|UXMVlJ+MoI{h0eaUCjPy z;S0eDTm>g3XZz2uLttAmKELSe*@Yse@}sK~Sf<3^T&PtlLT2_as8J9;VN-cqtMv&^ z6PLJIp7;VXy!e}?(o*{|s7o|VeNiu#+38D1xGNn21y-J}AAevJ1qh1zgD2=5{$GWM zUm74xq8~h6=s8J(vbtJ9z&7lKk-Q`rgfr?uSO_76;AbK1;2)E*fkp}$2G?fTcX~9=`;!5JCVxsfR|H@_#LRF0X3;G5 zZN4)0U0U0}{ZwRyPzG{`WY6Si( zdEHwZjm1f_v1H)`tB+T{<(4D9Z|~mnh&_9xq`DT_gMB^G)e=nDtIGi(1<*vD?hcdj z3H0Q8dSq1$7=Mc|?}Dmeyk*oopwuZE z=_MlQa@f}xi~Yl#8g%I!&uGSlfR5L6b)Dtu9rF1wZqa{6Wbyio@wPu6t>p-!u!IPY zP>nEf0I+L9@@_fzKViaq4q#N3eWNa?`YXTOg%Z#{T7O*Zr?cq_orxFA=kZVY>!OHE?U5*rp+Cgh82S@d97B5~t7GU-MR^S4sjQEoKj#H9w1*;xzxI%q$k3nh8X3kz zQ6xiuOjR=UXS_^?{!puvp}nF)8O9@4DI@qS(0|acm0>&&kOiw(pgo~-8O9?~FGD_7 z%xVEvbQNSz(r6uBJp(wtU_9Cn!G%;`g8G{(X2{=?7n!WX!XkY3p#AccUsNAM`MFlV z6qPaL1BH@xiWR?DK@9m*RKt)Dw84Dpl;o!VP*)|&U&sf3?F;3R+Lt!1l@23b@528r z34cY$9AQD3aQqOzS&a+%lNY#PzZD0A1skqxIHFjOPSm6b%9Z>=yw&Cr?Ci=q#@ByT ziHrZ1H7&?hr&hL5pi16Mp_Py`Q{)hMhdB_)()9Ds?(`XTfDah0<4^AG`=G0nbtbRn zg#b@Lu)oH${lklASghB6egxL!to11?VfKAC^4ouqMg6e494vT4mgKN4M(Z|YI{$+T zbp&v7(qCgj4r+Bld8lvU*}JziS5;%fwinwKUb}?XOHhX~buz9H-@FatDEq*jj?n@J z^7G4Eiv`F=##c7t{`#XUi<~GWa>_M;Lswa{eeQZA1wpp482i<+uGEpgo-8i%ifST} z>db#5Q&o-3E*G`}As5Wfs5#|j9g+}31az)hUezijAu|by=Q**^s}qo*koPl6f@q=d zXS5fqFl&g=g3suH+X@N@so&n8Go%uCeokvO{`|b&wK#N3-3-Ml9(a3YtGn>J@)&;? zVwYL(B8X&{8a5*H4pg$RhKvMSIZD9mZ()B6G#4ipmRn*f)6FPiVM06)mgcaT|M;;h z%zwK5kKKYcYLr+P$$N2Ob5%F^>+5#}`$kKSwrc$-4Ak~`eGem1LB>|x<1{Z07I7hN z{Ack(#ym&zXFHUx?9h|w@QR8ck*rxO7s3pAJW-dlp4#So-tbrFP1BFt3a>tL;sSrG zRu%;9X2v5;rqe2tgpjV%BK+Ivo7%=OmR`=g@olZDB5iM{s-m0$EYUQ$&GsF+vhUQ_ ze@?lT@2#&A#3S89A1HVdfSlewb``TlDQKiLd_&%tdSmJJjkz?+QO`QlZtd3=p?B^)uFjpYAhxiw29~-70Xc|2he7#Y!FdO} zzX}d1J*>7lOGG$lrs@>QlZ}331)jgF+QL7#yaJ_8}zm zB_r>s;MA1md!l>{>}ye}hFy+&FAQQQYd{#Tk|hAkTaMqom6Py@A{-fWC%lOjYE|N! zz(+=K;H;O#y*O@BW(b~`?GKYKi7yc|`{vmLj*SB^Mk6X_v|asqlWvJ55cd@6yLuk& zU6Zp`7e>%Ex{?vn@R>kN3Iqyx)HD;O}WSnb{1BFRN}l{nTru ze;tBgTv}9jZm0azbIQ9xsy2O?mZtE{agcHj-K29YJ*@_%d4F{`=w#RZc46C1wzlqV zW!h=%r-ON6)9X~G58lRwZ#LadcHeKO7trs=($o4=tyRd@8ZWEbtdQ-uO8EPxKP#=> zcs<){PI3=%cz^VA_qSdS-lc0#n{2IB{aBmsllV<_M&DH9rS+&)&el2}eUn<{?u*_H zyj#_d?3-U}hkyMujZ?vIZu_&!x(VYq8!zAB_qY4J3+;yMCVbyKyx_Mt_r(N`yQxk2 z?|c>7(D&82{Jsvq>*D)f9OmIv)-{~R;iUlY3jDiu3);6DfxZf(d}ZB$ckRYYuh#Oq zxQ528wszv;S)un3_h4Pw-2F{255GI~ef|@CchkWw1$hmAS1t_XX(JnXT(M*7RkEFoH4fp?&|pn8Ee;?h7!VPLIL1-l~bYI+nS@ zvx39sntXwME93~a{#;wRmlqtPDdz-j6W8k@?qBP(m_P1WSHKO{b_Z)Q@$@a*xx63 zSEx^4p5R?m>?w}X;5hM+C}g|MLhim$#eJssxt9eS|L}5)xN%>T9gHqG`#iv|HADDh z>kWT?y+$T?pU)sX+5BK^e?2&+(Y|}Y_5hn!oYvELnMj-lI=s&VY+5a4J%wLklY@*S z0TYv_j5!5w9h~DcljV#r0$x0m7L6qxL~DonahzlQOJ0WbwN~5TbNZk?Zf<~wRp9h^ zsgqcZKpctilwgZ%={B)n)}F&1`;Y5zQQE`W`Psqn;!~5fjZFgfkdp(BkpT~rm5z0P zQ+VQrWOdkId!IJ^$M#9Uf4=wh&X-A0$Dn5#o$E3H$}S*x3Asj_*M#Iy+9M$& zX|g)$qBq9AsdT{RC&rPwj73hvIdC|CL*Laq)F&TWt2~^0InX`sNPl;P?9BB2`gDJ& z!#XOnF8f`Hch?X39_lJZZZjxy-SdUp3=Xh=#DAF%+hw!@w3tA6xG>KK-#bR5>@2Fb zgbs!K+Q^BylMJuy-%P_R(t&Q7?3z^hK=ncD{IE|AoR^b@b!I`I&)f*zn&!2Ck2Cv5 zp3N&e;&Mxa^y_=6$0@oa$qU&W(_?WiajEyK`*h>xRd|z4ppmbw2XQA`kCQ#3e#7+U zf~hw%eX8T+NWY)lJRCQ`o19zrJ3cnf%7o-^xc?mgIE@kx>#{!a435_vA33hmw_JDd zdEPKzGW21sUk%sj{45FiPqX=dD0?*5a2nvyBsi2A9LPo>`mg%u9Pk)p4k3Cy$|HPU zTzA*zugP>8O>*8I;QMIDis*yGTjBc_xKvx`!$sn5r=F|l_WOFiaIDQZ-sBieCem*9 z#Pz2q4UXmen=-u5AAGwSw?Ps8l!7IQbw?bljN$y?PL(~HB(tU^Ux-7$@g?F{1@P+`=5}wcN9-l7 zr>v|equLY-Om?98l8q`!=TcYhr(#cIXFw14AZ#rp=Oib&aClUN+!)q}ppln)&br>6 zzFv=PL@NC_ts{Hy^zuw@QQxz^olDNECVYK3r!1Vibgng&xmj#~gSAxMm(SwDw%qI8 z7u_2n*Vo&VoMPkk`2fNn^g$+1a2P+tH`t!&(3`CXttyi*9QbZ9llE&|Z$+{HwtFBW z3%n)UU=?kJHyjSY)AFe2Z1DRE^aE>jD)AG1X{yUujK|X1-w<+-E>m+^j%=M8uh99e zCQEbKo7!>O)$Cw@x-6;L2njb#`;#jB>1R?|;w977G}$dUH{!>KfPG7|%lZ0GZ>sAe zN*~k6bJL>F5Fe-sx$qV6sK#ptZN8t-&i@e4WE=4zy!2%&*uw+hWaH ze@u=Go*lzkmClY%;l|{(WFOxUuWe))Ooy#<`Tn+wv~}eElsMp&>J#Z`_FbHlO})x;c4ymp+mN*kk@bF11$9lJe1)d>xJ^7jh;AvPO<(DUTkVzW`J{w2f5 zsL;vUpcB!@LcmzTg(lhe3%RJZgyCJ#cBaug>m$l9q1#0)G(rAEQ{N2Ctwp%Ltr>jE zCW{-oC;13&Q4cSqe7VcF_YLwDtDhju|4=n;KsQ-`Jd^j_h7qsXap#0xU6~{Gvk&P< z-($juUrl_tLtJYRE!UaPP_a`H%}fRU`Syo1Z2kc|7q^+3b}sTS@3Mjbf=$taq`!73OQ+eKSg^&R#ok*aejVE8>FQV8?72=u&(dvj6CO;6Q%re^QryiVg0 zR=YZfAMaPQtA+X-jeQ}Xr6JR)`$9IJRZjRPId4{!~lqWEzWKE2w1WEyQ>xo;`-{7`Mt2j3PQzK2?Tj&AP> z+B&%1z_+1mwh=CK+U6F-FWb3fj2}FQbziG_eg*9MoR9tb--nhoeA9VrJm6yu`tFmf zo8Lzpfj9(`BMzAm-Ntf$82yL&qZJ!9hf9d>L(zw&Ev%is;kGc)KTVyJ^e16^Ww4}w zea?p3){`~kTxIJrY;=k|e-!av0UJUC+8?1!-Q@F3muX75*Vg}lH!sZS7+XnW}y=Auh_*mHHDV~M(Gs$tA4%u4T9^qAcrNu=# zImNHraY?S}Wb+2yDL$%m{2yA3RnUHaO|VazvX$<`rC27CD|$EfxD#53=1;fl3sO&O z&uZ%mv}v~toYU<;dvR{ln!Bp+qGa=3=saP+M_IChw(~gIA8kGj4qNF@X>r-(bz@On z*QiCdDc3*$G@7*O=;Zqf^|us=PJ5`=7HVzB@VEGWF`>_Bd;)P^*bi6?6z!jX9%o@$ zn~?dZDow2NR+_k(NSYYL%aTsHEKa=a$*`*g`QuLUk#ar}>Pu#89nEwZ-t_4Rc~G^J z591|ii`IApZ=>2td^s}0K14dTI!A6tU^?>f5vF$~e6E&7Y_;c@;zI4AAKc-|ph zsxfO^zM^w1t&Q6Z@Y#FvVe-yv@dCGUz!cwXRXNhsoFF`mgIP7(?Q73T(R<5 zTOSJj?sc9T)cx@LAs?gKk}`%C=b`B>+*Yc~Q`C;zbTye!murJQ%SgF@OBsXYKd%^+ z8&)~)(^v(4Xd8+#Wjwrf4EWH3@n0*V85Zxu&+4ili*B{`#tl7Fv!yYc7};%J#F-`H z&2{^0JOlsbwpRm&b%LueYf_9g({1?KP*!5S1sgRXh@L^y=B9+lVy$(0mAinA2*~m!stT?@*Ql8MAE4 zata(1`Tk14f*ndA>q_tOdnL3A0;9NG~qs>+K zfA}~u@cBEB0n%a{R2?{H&^g@~VLZkzi%02S4fN&B!uXF8d)bsWSG{kG{H?@>{c5(? zbL6J8E$sUH>Arsq{}5iPcLXT3@t7L=?wH5*gu!;ANGTHI#5m_yHEaE#BCXThtsX* z8)UZIKHj@vw(5$N@AAFj_oXPFte@}l`#5=hp4`@J@!^nv-@2V3d3{z(*QZQR+ST*& z97kRavT}`$;pVNnM)rZ}O8I2NBN@ck{Y?E{kK?VzSB{YXf_9X+@MQ;lvrUa}81f{y zGc?Gyr1i(`7PhmR`}I8*NBjf&Be|RPw>-N)|4x@4!xg<=y7Sbavr_Ai^8q?j&t5OZ zR|I9GxOzr^&wj*uzpp<=ixdxa{(kVdNlTm(mo}=(6y62DeU3+YWQx)VQrt7EizUu?@^^jkgGTDZI-Am;9`fyfKbz(IhvCz`aH8mc` zscGlCBG1;Hu{iSs{W;PX5a_Qh&dy+e-KhSQn0c+gsb(A3`ioqzqCaT;wY2+yT7S|H z8tBircLe(DN6k<1o$2e%sdA&%UsuM12Ku{>nqS2Jepi3rw;#S9qVGp8YCpp9C1QSx z4@T>MuMvrV;rn63=No1hBHKxU*-r9>Rh?wXZ@%q>#}z!u`+MA$r^(;}Tj;=Y7XfK~ z5U*z&t?1Zz8Dqxp$6!oalkT2#nO(EPDtb>kXUOxKzcb=4pG~$WoYU>80l(p3*0SBl z(C(>4#d!qQro==kcS4hJ@>>>meyoN9Hx@5g-K#dSRzcnq(qb?} z?aIRLZIks?pSAQQ)i@5hz7XmbenX~{Fl;l3qD_w!bbc~hJv`5JNt@ATus75^oFw?T9M zYsQ7^acv@g)bV2rd90D-_iAjI85b(oQjf5?EAh&|nsJRhmM?HN-Ny}Gfc!{2X49}K zTI@LtUM!wO^J8QCjuEr@tIvDLPVL7;5`U68h!}73Zcgx~8MhHV3Em{=XNa`Y;d5)h z^8(*3M65e2kfY_VtQm#v%e1ODAfgu|NRs5U(=S9yZJ2)tIt zne*l^68{z^pZIrZeV^bbpFm&-z?eK^gAidyy-{OSr_}bwZ82V3u==S(avLK4xU;d5Lqga0+_)q4y{3$FVsWO~VO+!% zR08ojEuEKI{QGX+h^-*KoAWRIj5#mnndI`2n7doID0p+9+coGeA)XrskG^%VzXaFO zmQqIaWhIgOOOq?aof3=fK#3VuV?6fz`b@-lc>cXRp+g9N|FHD;XMFgzc^m+TUn{5G zZDhJ_T^*C_baige=5pYTpoGUt~s=tEXRkzr-G#pmeyR_I3LS-9< z>*8)qNbHl!XL)R`lrJOh2?X->*kWr*ekcq10rQmle(qKm_M?aULHS0Kt0M5X8-7M) znO#WSxfb_-JD%h{AAi1njvU)OZTXFajAFx^IJ7BCU83lfaIYFSl>Zd)IMv8wPQx+V z<57ORt}?quoopdTyxX|RGrmXPtm_fB8@A_;s#8>Wt`!zzdxJSEnSQUw{CLER^CBM( zu7k!0JqPIV#xg$nncDImxr`kmdBV4KI1L3ZDV{%n*5^-t9@V6Azsk?$>BlTf*(n&; z<&UlCcSfv?5`!AhHNxVs9xVEDi{)miA|7gacWcSa)-5_)H&^=DK9qL%hirV9d|3?^ zwU51`ckH&y>z?zn?Y9&AL8=@t-EM}1>Gimj%N7O;XH#F4cLS&TG)QH=UOutw-8yTK ztwo!Ea=n;IbmuP<_#f=q%eIt*=XtLQ+j63ts(1RG`m&i!gU+1UyG3s|m>1T=gKXFCwqFuB|HnplKAdMZrJQ>` zOjdWpVr$o5R9F2*;tAS3-M3#>-RbaCrJ%m}~dI5i1+jLXq^zgR6ll>*DhfyaR z9~fhgU|gJ6zf)cH7PGOk#st7(T|UBI&ArXAm^rw)?59$ZdtF6VqO&Y`jk-2DkOqu=tWL-NxnG?xz_B zSGWBFu*e+PT)dZU7w~PEs*Sq~XWJ{jc)i?prgRH?+i_OId23ltu8#foY|~8^*4;y5 z>f+c%XI4JUw6%BVg=4Q_d>hXmq5pkD;@aV94 zd!t)gdymFK8dweHE*nRo%WUZea3-E#`1Dg6e}g@#O^0$GwF8Wsb8pHC(f{S{Zo0xg zek~R1%Rb^^@?|mveC@XZX1C6)2hWDLWuP7B;NH&0y?N$PDgq30**M^*2Xt_BJ6VRy zy*BRgY)mwEId+N@uXJ1W+}pZ;H(XT4Zqmc=k^qBMuULp9jUxWL#mNNV8}AoeW0znz z9wwc531CtxX6B{a`m)!^A}lQ*Fe0R%mch{RvlC+N5xYUdzUdVod?#3fAzVbhS?_rP{jsd2r zQr)cejKOca7`Gwys0~P4t5&i=ep;A_gA^u_+uAc z#PKaZcV0z5Vq7O;e#BSA9F%?MaDJGIu}iO|AMxGdPB{}acoLu5_Bz9Hy;FvOez|!q*t?_&h;;rf7P>igkwxw{7%>9(uSgH#V>mfjk87Rn%- z`(%DseX1QFZc3^9?|13+yKl*xGHgl3+`*Vxn1&PV9VCB;%#}Ck6(VLfY z6DB(jl3jrpt5PnXL3u&o;djbE0Hf>0T~lB4qhq5#T+{jIX&3lIx8qs&m%nQZ{wVgf zonU)8=mht20{A%@nfzPAaO0koQ?)U}-VR9$>%e(?vd?`)z*0ypG@xt(*(mW&~cX_|EKSizVWxhmp&qs+^0sP*w3C{u8fFLD z59fyOqsq@|UebQWY|2^XER=JSXQ{C9NIYHsO7_`o8(_u!7~BRdaTV}=4)46dyoz?( zCnmoEehhIwNoR)pJWP5shHJ@}HN#0f>ko{N|9YRW?K9WIfIfPQYI!gNeX{t1lNzg6 z0nd|it3!WycNBV@b7VTU6aT$1&KUkD!BZO`!vd}+JO^d=Ruy=1^_k??Q2ccm%`iTS zHZk;fWs{8d=H8Q#KXIQV&7$9>nDBrucRkb@=Pu~g4%TN?bfx9a=L^mh&X*_oO#$Va z$v0nKEF5|%X9MST9AFCl4PTTqb`3hpp?54Pd}V)+`r4v${48vXfxTt#o0ex!mS;z+ zthaaDWsoB(V^|x=hnbm!e$ss1>&*-3?<*6*=jey5lrelh|%(3ztuo}S&$5%)S^i;jemic|W!YXE0h z8_1D0r7t-)`K~GU0r=HK;wUIE3hrxzE4e`FgsH z+YslMoHxl|!_u7nhCcUG81p!4r=OH_9q_%r8lp^Gd`ZKZl>&Tu>f?Wzyas)=(<*F0 zkL&IFfZL!GCi|Uo+-(=uet&-~=3|BO9qN4uyB@`Yd48;oGb{nE!MT*+atDm#F8l53 zQh_P12hOC5&uWT_$G96Iriy(8YfTn<_wZ$maz8N(RYnQv2@Y)b#*^sDd`Bb2VkXX&J^)4Y(a1$bI{7#FyAIzGUidk2911Zk6h^HK@n zVHC&1_SGBCyyL5Ej0=Br?ls19BYc+rdem5y+wn&~E+D|yLdP1N;LD6Z!CD%fDxEur z9}Bx++sRht`{&r!SWMbYDby#%WS?9j1-u_^%X?|hSLacjc)I^VvsnP|!V0<*mfCZ{~maR=L=sZvuZ_^%h>>`&Z0Au=Z2FaaDK0zIz~t2iJZ^+?e@Ic$|gL zXBr?QvH0)&c$l29^9%IfO|Nmi9JCA1EN(XC9Dp~?2dNV3B9lQUyGGk~AN0mj5pD1J zg>N%N+coNiJ*LYDdko@SjqKqd%N0;|LfMLZ+Mv?_A7y`gqsGtzZ{PM(I5+QDx&gVj zF;nANCx-oEuf|0(+Rf+B@T2AJygyY&zh?HFcsjoClkj~G)tA~r_H1&ww^e+ZjM^^X zj)O75pUg84)aco=o6IEe&O^i*yQVl!XCrOc%KTX@bZ)}h^tpYpR0RHx z^MrZ0H|u}#-C+}EH}qrDJJrPCmc>j(=xq)^t0ybF%qH!-qQBp1+m$-jzKi}0kb?#V zw9Asrdk46RcF3sxCA%udip!WnvVk{WYWxm^_f5e5>GDsiK1pY=YM-4Eu7Yk+y4jEU z-hBc+^|>GBGXU$WRh z)6Xm6&3#unylVh*8|nzRW6+^yE0X!g81uKf&t30BWNxJS=BxJLEc^HC;mhbEx6asg zSP9!7g@^XNYo}+uPNbad>;Fxz!_Mp8$Zl8A#%OVRqxQaSE#kZfnHY6SkTHwS<$1PK zp)-Hhk#`Bbbq{;OZO$j}>-g(sx>PMn9(nO?PfiFwjh&%PV;$r z*GY`+zH#YuWHBX-FBLN>fNx?*_Jep2?LL2i%iRu(=L7mgUx~BrqP-)Dahzqm&w_Ss zwD+-dUBnDxA9$|wF;?uX=QdryQS=GVyKVGkM)@Z>4$oYG35yE?`c%#`&9+`z`gU}s z{S&~^0e(FPIk;u(Z)UMe(%*Q_x&@Fu+RhPZWq-z9h=qcOTlPKb;W_4y-rM6JK$m|` zf}GS+=QM$SEa16gT{zIU{#124_MS&039w;#L?=X*ohJ2t)_KZ3UCYEQ*k z77L)>a}32{n>;`?cwCMV?%$f1<8mDI67-*nm;$_SSMyKTYi{4Vj#u(SP80?gD{ta4{7rV=Ch$I40&pZfNHKfr z3~dwrL*D9hQ}|bw*)h;})GwA>D>VIK{yZ5Zjhw= zA7oE|eZr^Xmg)tB2&By8=r zBaC~**jgt94%{}+?DNtGySIP(&*gs2d|xWgAtd&d$Eiie3EXm;6ZfWH6W@ZmrnrNJ zIw!@8fv(%^cty~?j;@a*0>3`l)@LY|2yK`pR;ju0DIogdHxap zJ^2zm<$ff;x161zZx-)Dfjlm8Tb#32yd+<#^hY-5?7oS_>${@pkKq!T*>{9bNPY)r zsov*VYt0v)x|4~ul>yR|AGSpTpL&yKwlo2albg0k9n0)n19VUr`+nZr4N~zjix)g5 z2Jo#JLx_E??&p%XPk&E&AIS~g$5P~mOaQm=ThNQ)&09DtEnRgT(2+EqA6@XW2{(y$R65qz7vdJW;_PKd*r%=P-NTO10y* z6Z&09Lnpc(5--AadA+%J$z)^kH@6e=oHiJHl)#ujC4WDTh#QwYN94!p7O(M67WqQj z*|A;sHRKND!wc&g!p`bF-l6Ds#^_fPe~0+O^|PaPi*cI;(Dz8@E^)u2$fwe4zj!>R z7vtsGJASv8?hD~P4Q0)DBF2hz%W+riMKL=j8$b_z2D1|Li>m9!vpUOS-S4z>$KM<7 zyFCiOe1ECvaJwt&yO>W4W5v8J&_ja8@V0y&6Mnxq@;sCK)R>U|d86{iYd9OZ-oB{# zJlWg0cTH`NLU}^_fcr{xCU6UQF4uMG%n)nroOeH<3H$|MR@LIA&WRz8%uN%icdm}m z#}npELt7!7B`8xUcLCJ4+@FYdzF?owM$!|1`+vEfP-Z@&E`azngtM{)Fh)5D_cZeU z0n8oa3i15paFB6P%s+pgEFx@}fXOjlZ{0cbdBnf ze0E}OT5hiBdl^1lRJ{e|3l`VG*Q@173h)K;KTH^H6%!MT?;hM%@t!r_5k=o8=5X6{ zAAd(EO-cMv`E$OUZB1ETv_s`si{i^S43~?AEwghlzYOZlpT{oVbH$jwwzICWd#m3u zkK5I55C^&FiEM8s&UCc<;&gvn;O4{hdf_HBhe5Hnp!;{0Ts!_gJVGCA9iSg$ti7b$ zs67b71C+aw$DWcY)%NTT9q#A6>IoYOn}1vIt|H5iQtA-ic9P0>Vfk%P*Yh$fx|_=aq09ns7ti8P0?j$E9H~pO+mL?7L`w z;`7n;j@?xx`xiaKcog)p9avlv8v}4_IY`0zm*aX0ox^zcADPbs<&RE<%>OBY#ym!_hYB?uK(M*4UQ?+GRXLC!p7B@~mA)W%pDM zu67RC_u1F2&S=YG9M@-zUry56%NAk)UYo^$n zbLI#%QU^M7yfem^yyu*@JT~KuIn;M&^ygvT$g|pk40%pF;io&J?HujhdVie09qu5D zqQB~lHTPC%!yXv1upw>NgJj_xn9ohUF~k-G^7rR6+IjOc##G`q&Vr@LO?%Gx^31^8 zQ|Gilhj*xUl{4lGum`#KbUTrc;f#4Azdt=sz+=#fPq)Lne*I)&aSnd^_J*_C0-m5w z>CDbpzxeL-`lZfr#vCY4_G#vI6&bXK2mexsiW<)Jg+fOd#;=nC4M!TWA|yMFte{qKQ1 zfO62wIb&lC2<5ZRxjc@~>W>rlf!c`a!)d$B6YL*&7R@C?=Zi?May^L@r>mUc?wE4`bXv5%O81ATNO-wQb`@l7I z{`aKDWODmkl%HMJA~+RO%wmT@4hA_qF$BFE?Uooz-f#EP!hcsldGXm@sRZ`tsl>nrSfd+-cB$+i{kNXq+qS#6GOf1X(lrjy4`67RfY zZi&_!&P-)q>GX2!Ul9lHneE1dNhQ$I+-9E(_IqzAG~9BG(h6lMHk=Ge)Vke6eQFivx=6S<36 z{Mc@o$O2u}LH{goqTm#m!+ANfSo{&E^=%*4*2$Hhh6`^G@WNP2F<0`XVNH~jv*xzr zWw%*MRDTI~Ccd90g8rU*lM3*X%F}hadQ(YPjs@?bIX+g4y{AeO_G{h(nk&Vt$?~*! z<4tus1o;YmA(v`<{|r>>rC?lVk=-@iv0P?6PLjuzT58cy zE<_$bApFFsVe)0tT~v5oqRLCqm;4c%_XmwlQ!DY|03fX zsei`71N!8Y_%40ZLU7>cphP4E`ZPyBK zA>UZOs|q>>+>WT5mFBrK#}E-+3G!^m!sq zaF{G4do33K~zzR&so(z17@J>R>reiw(um+?G;N}ebuxXvfZu%Yf(Cy+z&oaxC&*897f`{C}LF zXY|9!*z>^L5zj+nXt__?IFAs%O6)=OotSfB(UA3@s+0p1&n)f!Q$XfszGO4Emha;z zX!-F%a^wD(bqD#v#7$K(cIvN{&p2}ewaVfouJA4CFUJux2P4&$15 z3?RzI!y=0j^Y4V{c@ly5UCO*nbT!Xk$4i4Z2I5zh_;is2C#&}F^F@-e?^xcpd@zUN z(`Pka@FUrw>gU1fsk9gOj=HQCP~pk5Z^AwS0>9w1uftUV0c4W}#XA8BlR?EG0eh2T z#X|uolcvQ|4Z{tqi;x-~5>LJ2`l*uz#z=n?t4E$BT|&>RYTRooWavIfQ@2|v`7%Q5 z6RZ-@;AO-HuC^nv)%sV|SEfiP*{KMnf!(@Nb zha6?!#Jz09A684yUe8kaK3T0&b>ClAdzR-KLf+QJdhSWai)Q!JY?+kgg-KSA4 zDN}u4@^6KnO+N~zOx9C#NTVOWk1;q&s^MVLrnnoc()B&(pym}bmzIc$1z5%W?Ibl=>?xDP$<1^wu&o`3IN))hgRpk6g-1B@|m zN;{K)F%FEj8nSkt`Ypw0P%IJfcg$lt8`GWh1nYn6L5)+o!I+%u<^5AB0etJGRlu6! z@o}xw1Dt%J8kR-C{dVRsYGnQTe>d0LYRk>t=dNGsaggp2gX-%X+-5?9KI|a#Oo3<;I6s!6%RQI@d$LI*vuT z%C29kGyEHH`lbM5qAra#9^x(P8ml+gY224;?lo)7=0N{T^?*J~Hxuli(MIK%rLm@L zuaKuc0lm=Kuhe}sa2o9k@}60V?r3`A&Lw}tW0t?TydJfgtWrdOEy}D8;&+_*eV^Co zQ}e&7v4YwiZH4|ZX37@t)=gy-rY}C4E(;r$&pe0n@#VPL_HuVbH$MDM(WfOZVsFmk zjG0Yk=;vl68TQuOxv)R178Bhs2cAi}Bq*LhuJK+s&*_49KryyP$P5?@8F%sSUs2R41^Vxl#!{AOU_PvJ68iA&(dUsWW6bd$ zWV#v8-_7pubQ!&u##~O>pe=*h_s@XI!%fzfFGA_JT*GxCT+}-ZVQ{Gzkzaq5HzY^l zy$pwP)DTRv223gpCV2%Ww=Uq>p6Lu+hKD)SHfSGaxhSl3oW1sak#v78D(2ac-B^s4 zypR6036IUr>-^PCPCTA(IF0uON_mvQF}GZ6+`@bCa}RCWR9BAWLT7)0c;rNVGE8ocfwcu~)0meYZxrzc_pG1siyzTBwse@gBTksn#;G{_f3>_48V zEH9pj&%$$!`Pt@-PMGbU*M3>?TI*czV>-Vor>}XgSH@e^@!{_!%L{)C{7u9q8vXFO zkuJdJqQ;r?ct?@ng5uNhZp&bru=FE*8%o@7F&cP=*A5fm3 z0(}CU3S0F)n~eRAfQyQsVe>L;b({sCKyJ5yE&AwovcO9xbpL<&M9g%fm|=B}Z+0R4cqOevc!_O_OF?l~jUhh5D zT5h4~)pWYxc_)9dcASHG$x_Z<$QdHmAI_wOjzi>U!!vTw!TTj_Z#iuxupaaZ@y_S# z{JYyK#v!0SySqPJFWEVCi}KZ;bfDy9)lH5?pOj0-_xB#}9GkDNkmw~DzhF9dFxECu zKm6NZPO)+BJhKY$7{cQn-m4lEGmE>NtA4kz;%$fxspfyf4f6&CV*g})_FH!s;^*I$ z^3ImmT=Q|Rk$q-z6Tl7nUXZ_^pHm%i7na(0a%GTxSx)plv+DvaBdexzyQM%QSSyX{8Il}&pnR2ZKA=ocAe@H1@sQWCyQ`gR z%;m;>KgQXPvNk=N!`^rBUZ6*7WjW^e5;swvWVueKK5xRfde|eZS%K&HUANPl+zGi5 z^Fm^b#)9RS$NLu7EtX$b$^C@;1+wBjj@`(Z@#=rOKC6l69Pf{nc-2M&1&-tK@OWMI z4wbyJl20aN>Fx^PD?7w*Mo{bR?7$KxL_ zFJrdn?B6GNmq=YEKYqN7fBKaEU-3lZ)5mn|f5m_7H0=Mj>rMX|rt*9Hp{2y+fB%R4 z8@;TS&zso)jy*mv=drgJKMnidaO?Fq%jbW$U;hw%yPU7QX@4;s!P|fJ-2eUW_x}sh z|I-hq{!{dyh=2MRp#OC0^569T&-nLdyB@{Xo9F3p^XBUx9=D6(X1ZL&e*T$A|K0q3 z?C*bw!N14lbL`!&{~TMzri&Ono<7Fj{gGO&FDCuqp8vA?+*J#P;0R`1`( z_^ZEvuKpIgip}9aU;psiA07rzqv7Vl9X(DLBiWoc{SbQtrzBJuWMG}+Yq4cqRC{vNu92!x|E_}lhg0pvt__{PtpaX#gdE@sF z$MvU&<0e~c6|(om%}uS9Pu8CBcO_MuzC73Bg=}?JQpY~xMKLtyxH&eSG<4jF;%2#j z;r2esk}D)I`Pv{=Vonb!)M8N;W*og<+)p!4gCrVvJeJUrE)bU8$J*7^zZ!f0{qOhw zQ~Ce%h^XRX^RoGoW1N!zl5yhysno|*I+X(cpS(;Z|IPpZ8UJoap11rE6I=hsfAxI+ z{qLXqPtgBnwBG#GU#~~=fp-8Ia60{eabrZ$fAUl6GLioO+I!RPwv8lEbUyo6V3c#; zNHY@6MUpMgaxS%+jy7wzqudw-nj|a`V6cdya`N9_RWH~9Hb{_G5^E-w2sXN_Ywzmn zYT^I2-fT6||7*b;-{pT9Kj_@8sJ=G<_vsyX^;Rr(NZ`{-d#FBxGk8n7$|Z4s9u1AS zE93iHtTH;!#Wvv;S zHEjAjHeBiYmTnR~gbW#T13kWt@T-;oSFgRPH8#W7G}{7?w(EmW7(()!fJe;kz*Kc* zmslGe*HMYdXO=Mocr;WE%Y*-a2%kqVlk{BrhBxrLIFHu^M(DB^eqYZ9;=<5u<-Kow z?Gndb00@rpRCgR_3J^ASuAHcjrs@W9HcouggmJ0|hmFL$XE43uZ?5QML|_GKX$BpO zQ~dwB8mtmtM+grtdGK}KYx%Ek*u7*IwDE`#C&tM9IcSGI@!Ujn9M|@LEaIh}bF{jk zSR*o2`*7Lm)UH6uy0yJv!E!1Z)^-7+vmX8%JX={$_RDp3N1xX3xo8;aH+Z%Z>-P8f zC@WvpM>T6sL-mnZ8DF4$JD$-~HIKm+F2~~NPR<5i>^rtUVsE*2&l{@_5n2FgRzsWQ zt|Z?3Jr6C#-PA(3Y6y>i-J?(y<04IUr0!^lLlrYuyx+*D*cdC1AoNUuu7o-){!;Kl z7KdhXXEtZf%9YvtI4dt^aA5=^S=^VydBt3p;I{Id_IuW3%W+uF43j)n$WKM=ki$E? zLApO!;mx5olThcrp5H}|=4BYp*1q(+JPpj?$kW0Mw~Nul4CDoWXyX`#BV*-gW%^yd zW~N`ys-5Y}Gim6YNmQw+bMchTB{OMlI>uDvQ=q|<9VB$hH}^NH_cXqdkMYuci>kef zKZ!SSY;>!0CZMw=_!4L{zp*QUAk67W#JiAoBwmT-v`$>jF-Cl;ztUD*V>mL2LZL(; zm9B4?o?=@Hr5Z(l*~-8kk`bS3#!3*D{HEGQ%9ir;P(5C z)gy{(!6TrA;thz>BdX^+#8vDboga4c!w<^kXkb`RL61Fu128f+OjGF+#jrHn8QIvE z4j-U*?8v2WD7vlrLjsFuL}(2===9)w(Few(JQuq11^|b0zw*9uzXAYTL|KJJy6roF zc$X+&QnUNAwod!Gw+4U|!|Dg{&^f9ug@VBiGaeb5f=I0?XYkw^8!lO=E$|^u7XKd7 z&A5AO^-F+%_b+Sleht7Hj7Mj}{uf4K95S+917Mqk6!In`N=QNU!hk`FO@gjn;Etgx zIO26f@JUjMr4`r=$}0?ol-E^pzdWIqGE`EoI*O>Ga%$-JB=pkiCjq+~!y;2Rp*$wk z2GTh~hM--o-9<6eyggHOV?C<;i=I6C5`4r*Q097Nxp#Gy;6_b?duU|5Wg z;?o!sZ(!>MaO4n!k)G>f(dLA9mNe=PwDO1(A0s(VtUvlYy#QniBf~8mImQr>{>T{G zb3o^RrF^RceY z5BNGE0zgR>G{rW~qz)M%IT}MAlCt`uthP*3uQIL4CMiZk{aJ?l<$au-dFKg(u9ska z3Eykiuwbcm1`}hu#VMAC1yLgA0G>Zm68pJ=MaccizhDW}rTr+j=%^;+!|A$&*rfn} zh=Z^PYfNyA6;;WZN_=6S7UIa4xn5B!+Lr<;3Dz;`c^d;2XJ$Fo^CWj(b_EM-VUa@-1k{Of#$9hGt!^*j~DR}z?%(($yDN^qRw#L}*> z)Y>7>DwyU~Y&}2SG)z(JhO1D?z+jo_13DB=xe3iRS4~r)5d_8cN0`t}bfr6?A+MT( z+$4Os5=F=fLgco;{mi>99bc#={T9dZp zsFN~&q-L8Y(Rgq_#Ttb9)RG|>7=QYnn&5a9A(b($60<&0M}LSp57kjcGoE>&oPf8) zpx=_Sa)Nt{XRfYon?$u{MmK+de>Rk(Nt=0Oe0jEEqe^VHr6^ah1-BSRnT!t#PLieZtY?qW{>|(GS`8TK{KBIoO(7r>8f&nB~MAQTpwcL z)X%ntc|TyEJO2H=rRlvS4y#UgzbVRP5km9Fo9DZH_|uGDHZ`ilLa zP9(OS;Kf7Ro}b8=9(#`O{b|$1+^WRk>19a6WU;~^3&!)zU}Qw{GT^9IC|xQpt50%L z=>}5SEiIUCMS}SkVYh5D7g_nF&CRp*?!?k=49D|T^CU2xvm5)2?p}no2j~ExIZ|NP zlTGZQ;gXdi7j{;EDg5BO9-ekFUFAO5zCR&Xwtc@cU9#9rn}3X{(tUYGL_TAWCSb8i z+^;AqGL&cmJYYDmq%$Y$%6MRC1GXCvuUPk%VLjRpL{XJT#(w-I+`We}49usx2Y~#p zNfbUM=-)M7zIS0nZK9bn88Zw8`xM}FPJ)+{?c5vzC6fx>9sz`tDcxZK zeUppbd;v|f2;K<+EW|Z3&Sj`R8AE?4)?;ifW>~E9TcqHhgpa2_NoN5jmJF$VfjM`7 zrq2A}Ns~R_I09cqlXu@X0hg1m-#-E#Rg>@EoE4Wnv1ukDWRkh^kz)NU(qzl$BB>9P zpx|A9Yb^x0WZ9Ovw{``@a(q{rp-i#XqUwjpLenY@P5BBsvamEOUIou%AomG)Q@|C- zHSbmT)DDeyEmh>Yw62@d_cGSL@quEOKNP?>+hQ2oR$IDe4(jpmN)S*YhiNKFQ{*Yt zg@Ab(jFB2knm3AxaY?mnnb5*45ze;4v^dXy{nF{!uF`Ytp`u!}q$O`56Y`9MK1+Zg zb2sH=a%ecN$Ga`?%p@YKIUrUQSLHanAiw&CL-ZwB3mK^J)M;r@W-2;Y1kLpQTuUL* ztsaXeZg7x-jUSnG9NgFuQ<){0$PQ>-IrP^OF(6L039BuW?Z!CnOxXFw??+ddBaq&I z|4le3QdLFfkPOj(+p1s-aK1tfPHA@4Nj#XhxzGmAW^H&>7*yTca| ztb-Xtj5pQ-jj}5G-B1RzLL>9pR zB7|^QQKj@>9PTA1jSp=#M-8(gm75Puo++FH&6K#*;^8g7cMXqF-f8TK&NOWxQ;k|o8&xk46Q_{}9t(T*w+nc4Cz#1YvG)za+^YDBn*B&+kA=AIK2VHiyzl{;-xsp1iVXim(S`3s&(qgE?kH)NE&7GJ-B? z0X=wP_xNCxc<%Bb>CTqCb?W+m8i=#>Y0v4U%=?yrY_O+xN49j&x8FuOJ0cu!|CyEM`)vD(?|qfLMgF*1pUgUug&k6>4{C2 zph1airQ(r)d2e1$|IM&}QK|XB^L$(~`0h=Dx~?qkFo}!5dYT(Y|5Foxv66j&Qk27} z3ALH`D}s74rs354w;c88i>K)#UNcdxmy%%m^=#V%xsnjaY4X!7D~s8DkQ}vMozbH` zi}ZB)t*K0GGB7bk5|c^A(q`IK#d(&|A;bgsmKP73@9ye!XD=dX(52Ts3g9Y`4Y9DO zNIWuEDseIb4c=27GKTfFgf}3XE^EVO?z#1CTklSQ`iV6a1DU$R zqKyK|+Qm~dGBxMfE6dySiL&MtK}*GU=Fr@^ea;z%ni6NoV~0h5%2^WA*&(tFvJm-$T|(cm2H;eCLDE-b5Ox%e7mW|zmQt+KaWp4G#g2%?O3Kd8 z2ql1?H(^Y!(ga3-1ZTSec%F37Y~0SHR5CkUxGfBeT3@l95*f8y4C+$Io^jv%QYkK0 z5^VM&y}zfn&Cg=q#Z-o2hqE1*R% zhH)hzrJahVyEOjH*y@;NHIi`-r*I{*uzkslGdG2Rl-xppUBulQavYH-Jv=4HoOHxm zq*TIu#+kLO4ojJ`;vSZw#=c2_KXu%1E;1zgTAD_{m4*!0W}a=#KuWgvU6DTL9fH=5 z?OjThgw28M+b@%+Y|9obF6ZCCU1Wf>Xd#xxI1CgXOrA%U;yo=*lI$+lGR_Ky&$N}( zp*sR<{%$~j0pha}uoP7s-pD?0%sG8GZVBBCrpVAd+*Cg6l{^)gce*LfXsJOe3GCsa zHhMIT6=W(PxQunqhq0=INd4s1FY_HfnnqcxOS~~5R@syciL-(k1qO-?N*t0!ZaW0j zj1QTMBF+vGhirG!=A}h-C;+Y@FEfSqUg-J7V2U-irE7 zPtVH`<2?-$EW%()4_-#36K^b*sxk(#H-kZ(r!HXDBypQQc)nbUW(~badd9~46Hzl! zkZO^C)JqIClR?evV<|?osLa`dDv`CRq+$OeX3nhrQ|r$qbI?%~uI zz#n`l(R|{SxVKr06f=`)?P-G&%?GMP3SH1TuF1N=cS@!7kH( zHhyAbT66 z^y^p!e+iab()Ql5t?Ij~iJpRfs5*Gf@Fj?qp^>HBV#c=nciz53o*gUP?`HI(iPP?A zU|3HIbVBo7>D`v=yc_^axCXP6>*+xOl#?y$7y{O(lSk?%f1!4dS2i0uXY=)-z%}sN z5LuZ~#KC%+*wbUAF}>^$I~tOq?M##)8UNkA)!f=vR%^{I<#F%)dQI6-+K;M169PqR z*2g=gUfVj_T~`|TPxEN^-r8z3;Z=z@#VhMd3;)@~mmBrwrn1_Y{&MWSb%nyPjsLvC zf8JtW&HCnBe`U2fy{}!C*MvP$bIaFU?`=t9xs+z5`gxB$+|p z?kyp3D9=%8ySEZj6k{%I9k6{&F7eH@6y?4glT3Vfsu1ON6_Zo!N=}CI=M|OJXn(~b zl-plSRF@)XfZXYV#@G><^N%iW`ys=R2ZSCSKvcFPP69eL%C2w{#)fI)DuQ}J7V$Q~ z6H3=Je~ltEzM9O#D2rS~9H^=j-j;tqKn8AOZWVV81C)X@ZS*bFTnfX6(m7XDT?d!T zE#lZj{IwXvC=ya?MI+L>zZf0ZpMQR;TxCFVPHIDvyzoK+$ zKZ-3nl37s%Gn&3s&fuZg4XgADP%LkjGoKi(f2*nWm&w*~u#QR3+ZdoWcMY8|1v5{RbDk@;;H2eW(X}X_txxk zD#ny5N}7ea- zf4f{aQzvHFzXdQ>N>z!uqz!u|QRyoQbk16cV@5=$j87bz1!oqWu&Kt9vMPu=XEX+?40W8$41uy zV_(K)D>VMZ^^~6R1S~>u+ZoVf^d_v@Ble{XZQVC{d0pJ-K~A>-9>wJVDJFwRCVH1O zkwxab%x@*Hv9vJGxAxUl?pHKtGV<*E6^<6VQ4bUIO}dpoP;u*t-dD@Ssh~K}fBnj~ z+SJu%eP^?^(`t~Nx2?^d)@W)yveoTwzUg-L9hGdhHs9{3t@@kh_Re;*yY*(fw@F$% zJ1w$Rzh9Bqw50G}Qov>@EVQ5?fvRKN)wBV3m{(%^jz)kB0imnnW6gW=))ZAF3EIAE zP72XUPbIGh-Thq#Jw5k=*2qt0f2EZ|PAYnD4-J>ZIkh6pT>>_OtTW)V5dKoAQ7%87 z?v+Fk4qZ71<=d4aMNxUWn&vwWrli?!Z3L3svz_7U8mocJZe*}s5P7QgnB326m~8i) zkF(sRr*E39lN14=ib{qEzxw3P3_M2uMOAu)RAz+D7%LIhWbXQe) znBH5DWhbr%4j~8p6j|HSgK^vLCDCjvs0=JabkKkLvMw#Q%=af7P?9%DT zDD+u!cA_VA1f3Qo42fBnk%WcRy``CRD&{?6`Y|pGJzQARWwZ*8e|L|7g9&RKTt(wC z5f~aTWUw8@rkdQPP4BJn0-G?VEVZ!CE1J6;AE=*MDWkv%nPKa8dAyb4(5}v~Zks8kFS?C?WekbisMlv%G|pDfI9CYD81igZF0PJSDg!}URWTp$ zg7n;uwHH{7%C26xe~Co;m=X&0lq(d~2uILC8PQa&&~8a7rMwBe?1*19FyQ(_8qR~2 zD@&T59x;JeuvloDTH0z>Ev2q?FZ3;Fi)sD^ZB%lnGy@|+R|U=oeQBX;Y$3@zg)D*@ z^D3U#lIE2Yb@ZK6lnAFJkjG#7c6^d+aq=`=o<`>m?w&X+e_=bpvSE(;K1JOw*%8dR zcSbG}mUWR!*+^K%T{FuI!@=OKg@oXemDuO@g9GN3VVlZsyG?P%+?%F3+FKTyW@%_< z*$k6~rd9C*dG`AKXMBg88#x|noJT!ncKA)5z#vpXs<@FJyyrQWcd_e0UZS1LBw-E% zo!jPQXgi~Uf8h@2;hR`LFM?fMb@INN``P|dw?)SYnaeceQkM!zB*lWmKC)eUI<>aP z|0eS!$&L`la>v!!w5Bt!^jWp@92jC2XlaMl5GzOtkpf3CBzKal8@=j=fA{hZtHn!9 zV9_5M+#QO;3Q|)AtbF4H^k8rB&%nzNtQ()Lh9E=7iG3 z92!!icQl9D^mshpa6Nd`tKC~CST+F>gW$N3OtXTY{kx`i< zzNL!2`wkv!qN~e};j{F>M!OulB%VyGWPlUg+n%a&kqR z#FvC9v8y5*t+x`(-YLMn2%CxZ84r{9{LFOeOnj0jG($YO;7f#VBVWpARk-RSNkP1n zT-egHPjn%b@|i0YvfNZA%|r5rr=^fxOgvZ8DNmlW66e9SsB{5#)|=&`sNxF8#2mQ_ zf3aM8B8=DXRUWV)nW_ALLG5GBW{X?=%W;V2nG>wUWhr=0%-VppCm2(fIzsE>vtv7o9V5N}oYa5g=Uk>=Ue|S?fU3z@^vL3>&Vv`Q1lsSo9Vf*Dv3fdDWxmNCyUg+p~#kmrLuj-QPz;N<#J`w zakjPk1rwSp7h49@RMrslrT1A0Jrd+ayYri^jO2nst5xy@e@9jd zLdtZlOM{wBMW_P4nBokDtS0gp+SVjH34caj`{NuIk~zh! zM^1OsU!nvl7``w>%CM@aLTDw*8DtRR+ll;(5$M01xaNEB8OAEdOkUDE8|DhpiY{g` zhcoPv7Oki%$~_DIuI`}2RDJQmf5j&BdGC@Q}moA zlGsX5BBhG=>Aj0rPU8B-x#ly2=Hje1nU~6`$lF|0o+X#G3IV`#J%IpdFg0^eb?2^U z@od|>sxu#Ysyq~%qm5I_J@>#txl^$-aAlu(U)A=2n!NNEo9!H6JUUKgDSzM7;O5*_T2vYwEWbRO z{04j}VOwbPCDgJgeR?q8h|3qZn5Lg6mUd$}p0AoG!BTp5J)Q3De?`RV0XUO59k=by zSlNwR`T|j3=o{>~&lg-MIaw-bXFX68fBqRe zMAh5N<|!D#F~}n+;Ht&d<4gj96&=qkbMmd>n8tOBhvYG;mgi^rQbk_M?^HzDeaZYg zcEH_fe`}>s8cS)5f1mb(3#@ZxISHt9>|BXkP_!u6Fj~r~>!j_Td8+daZs)7l1tZzZ zQ(_Aq_mSz)0=u%{SjN@BDS2`;*&oK z)sVXzV3t^hjn!;i;14sns!t}0k(m0Dw_{(%wJ=ixFnK7df6VM;VPUyv)UGX<*?Dw6 zvRXpA$Y^qi6!r@$isrsMZ~0Kk)2vc8=6owBwt~&mzE={?pt;2QDkHig(^$W;Q=BJxi!c4MOhv40${gS^ z95=Dy7N2hNQ$=}p(&%K7GD}aB@(&P1uNqfHs%yFescs#VOl^}r05n}c$h$o^s$-~n zkQzIO_D%G(B!w$cEJ;;H4(Sn3>-ZR&Zfo;>Ym|%bH?}VMOro8 zR>#Bvpk+X~Rka6W)9=50Vf6U&1yd~_4IR%xdNk96Ru!eGAjXia)l!-$rP#uf6OLQT zf>eI)Lkef?j(d(Tm*dE=G}G7VdDReqCFV{$e=SwWS!VL7?((^OCZkYg_NMFw%tlkb ze<97WXE_#iO3v*cW;c}s7t4ai+293WVYL#GH4R=jb1Q@9Qd#3uko8SnhUwQD(;xz@ zE)WZ%W`|gROuGp_*txea)AupYdf&T5YWE`JBSjR%HtvWO{8@>Ry}I4YKU<>z%SpnY z#>=xFSelW`)6=Ke9*AI3alJ|5h4Nu#1$^NWThA2DF7^MVeHp%|O-KT#Y?;jle zcjeXZum1Me`x&vKoUbv>gZ@*af8wLpJh!qj>h=2e=BASMoc=Ug%HJBT&F1#@X8p~Z zt-sY9%{QBMUynYS;SN^F)uFZ7WlXJ1~P>yH`7kvDR4PAqNRCCoLV>Wi}l=Q*vi9BfQ zI{n0FTVttMtIhh_x{~p{e^FmsTdPrott%U?Isle4(h0xpX8KrL*+XruWj}9*05ntM zw*Vi(f9!QOHoa>qYxGw3D4SxG-6nl4EkZ{n?R66(`IJVkv#^Qf2NuOl&OERUbjep zHTm{Nt4Y;VqCK1aWhe}6Ddjs(Z0a!%O)(ko6W>Y=3kp7CSo$HdT!z7@JkPd>s|9P6 z#OQRGaE-aH{Nq3W`RS+Mep_tnP7UfIw6r{>ecr)OqPVaU?rz}Y1A3VejuS_BD-YejDSW5v zhB+Ik)$EOw{}2=Lk_ z5=tl|dd`V|GtXC@o@CqF~)}0+-YdTQ}cSb^QiB2wmU}0?O3Oe`rU`GpYKkL zGt-T~XI(sZ%(~kdZVkG(H_x4~qwd}1*y!FKjjU?5{bKjy zt$9E{H%AA@e@Ev2$Lqt<$7c_|KmGON2F77_; zA0OO6TlW2h@ihAQaJZ{pcj#yJq2p@x577Q}kB-s0*o(A3g!ZTK`}Ft#`n*1IFQLul z?(NHfM<0Ve_@9?9O77Fj0@=R;_~SOJo|8b zumjKDigqzrcst%7d&b-GXNV&=(T>h7){f5mSwBj^bPV4e2lIwLE-#O}hzB?=V)WMGnI^`1AH`3Mwud?$ zpSPPzfA2W#jE*Jo9eb8B4=NKU^-qaDyeOP}KC$udGI*r`rWk%IqhpGvn_GoEoi+YV zhI|*mluuh}I>w%*;iEiw^DF2f3MZWx&< zt&fI)JBy!lbViDVDI?-VFx}xfqhHS@uc35)A9W& z>W=4+U+L%i#{?}o9Gq|2{NnyWQs>Y<3gk8>b1{1GvC{TBhWn?SKEh|^b+xR`jp@sn zefdW51wK?U zFSd4*bdBRWio?T0s`Fw#>HY=C-T}%>hMXq!E#nJ{+v~kd8I8#S=Vc3Z%}u6EjVJi~ zmq#R`OptVbj_d_9qaR60iJT@zEi|cvHm_myHADokI`%jKlvAh>w{Roe*<_n zDB@>1-L_R|uVVck!S}ZZ()=867xO<-yr&-|c<(*+FI(J3Yy!X1`3kzE*4Yd;O6yPA z_N0hcW4f05!t;_4=KFxynJAM9qhkbsYber}5hvwn4*1VbMd)k}3qpeZ* zZue2MKK99EclYzrN4Il8$8L0w4(r`k2R=6%-S-zG?dWOicyIUY^Q}J6kFMR$;qIdj z{lK#;{kGokUG5IG;f~kYf7AS9W5)&9tr$G--TtTMj;9^%JgavXqi%CE_no_=&BtT- zeLQ*F|Iygp?>4ud_4gkdpIR3H>#5c?-ag{|uHSzcb#KkOdiUAv9O$P0{=yXB!`!s) zP|S79)b4Hu-MxYT`A+L!4R5SZcNgZ5M_Z=O=52R}H?0WX{VVInfBQ7Nnf$ol8UJ`W z?&p7h0N+21j;+sw?)w|_c(3i9Jhv$=1n!TAH&6QQq07fR)o-5w=3SRuGI&1TUOe#c zC_S%^Oyl@rtI@svU}{FcQ9S&c}3YiIw& z?J$@=c3V2Y!C?K=BRm9ILw?&j({CHb=ev%5GIGL)Z%EH%`tk!M~@U?=I|a^Ws@N2j2Wjd3ula*V(VLxyNPCX0YS4 z6aN#JIt2kCf3}dv^4_KV^0ke;GdbBqz6qYW44)@)+9SOtTmI);&BnQO_I3wa3v{9N z(MLV^>2_=%U!6=&_S<9lFSCy*ey^K1b^YjOqS4PgTGtH5_^RK1n1r|u^;iLKO;DDi z@8|H3cl!0?n8LUhwC6JRfO?hV^R%uFP5*P_v`%o(e+Xbn=s^Et_}RQ_?V8%~u#S68 z#}8l|P&YSC`uVzbF;Q=~Ecm_EJ-YTUj&8n!UIkrz^N_7;INpwSu5{FsL%{dt6X?b^ z;Jj^}?>}{KTizR>A=1wKaj$Q~e@{p|_zg64`zKfJ5v8T^Fk1BUAMYAFcQ^HaopU=D zrSa7efADd)3-fP`^dqzR`Eqwxvpx*SO_b(4zSjEK*IGATK=VV8rOSS{&UugDZH+&{ zGi|cveg@p?M}4=m&-5eqb8G=`;{F`;cRR_~H>bt=;pt>A_&%lkGxe8I*xxhgoBmyn zUIQ6)I{VlCA17_-hw5?EmCsGos)$M?IFZfp0sb7aDQJ7Z|~2=j4&yy5!gxf9XJfxes^ ze-95IKJWEG7lwM^#Mtt5z!%Up6OW?5ZbbgII?V0RwQ!6Njk@1Gy751^E^NSUj!qhg zvA{pPnS7%9W$XFs_HcYV(Q$kWXd2=3gB%}4%wuN^&j)ng*6Hb|yWKAMjxaY}zkNQ8 z()yXtmD2&_cC!1SJ4C&8=&E-k;90Qge_%_yM>~VhoL-%S&%lc}KG?wB>jRTN3-R1x z_y;^)j6UCqcWyR6HE+foraZbo=g}Q}+>wCmhRMQqhuJ^x)7=1k;Ttb}elqU7uZK44 zS=iu{BD_6E@G?1>Y>pGOs;lomJnF3z;P;3A`PF7W-Z%9nL%x}8AzZgi4%<7OI{lC1 zG&~2%G2;9%iTHl-P6n-R04I-KV|T1Engf1rV!jIRr$O790bRCA+SaXNKNV!Wcpj6_ zw}%gxj|c%7fBnT4$VOytv|U|mK8;`vw*47o{nPCS_w!`~WOGo*byatGz1Yp{Q|NIJmeRbg7?FPz!eXI3d{+IFdgR(bJtv*qX z?f$D*f0zbp*|egCqS5EHwg9aaGIDG@92C?E)osn^r9o)rL}=18Oj3JwNr>{(o^3tC zmn;Q%&mIm9&;5CI;CUnW-Rsv{S+kw~8a?pM9w>d^& zwD14^^IHAis~>()eqs;8uE9_Z{4O3Hcpa@+fBqWJ5~vP&{YYPE)oL~N*XEkC+N?Kr zHtNld`sUgz{Q2iUPi>F9`{zHE8+OiE>H5Qwf>%OO2)WQGDLF|3+DZc2Dhp^c0JIeV z+SsVKDh9Nf1hiQe&_)1glL7j6qtV=GG%5zPkp#3+7SMVCXd?i$vC(*2F`)G%p!Je~ zf9?cu)}wGXtA%qX0p?CgDBlVwcNPfb+XRqrO9J^u0QoimvcA!*SccvtfP7OD$ZY}S zn+T9V`$~b_P5`-G638t9C1jzb!wLm6qPifO5e}HT*5Xh9>DG6j~bpjyYZZs=4I)Tk$FqX48 z+o9alqcB!%!CyX%+X>m;E-BmFLbkUfvW@?*7RZR$(2tRk-po7Fw_cTe|5?_L;Ej}CsmF!_0t9x84%^z(1_)dqV~eeXx8fM$_Lf*RcE3!>-Ejtm(Z&M zr)oSN*Hk(TMgd=&Y$*5jE0^vI0UUp*GX!U6$j)w>Uq_3LF0qr^k1T9w( z+%=@pUIY|?258H>;g{{;R|bZW2kep|&#}#Q1zctE!K6U1<81ILC>+9Kz_!JE;tiEC z_};7^HegLTwAr0TBj3RS?QTDa)qvnZwMpK~3Z06ptQu?VRje1Z4&-w%xDEY*t3&@@ z$H=#)Vtp)V$9rL4Q4BcBP_;mHio2IwUmI}1)|Hn=4FM?w{r{|&at#3`9#6KvqO8KZ z_?NS?7Nt7;A93<%=sx!4C{h049gruNwG9C(0SA}h4FNEJurB1kXY_quA{}=(BI<+H zN=t*TS`+pR$bkhs03dp8z>wgM3P3Fc1h~R-v85^)ias%eYWk|e&_lahk57>Ik(ef~ zLJbrsn*ztD*#}Nw6<=c$j%qKuA>%NjK|f4(heS8n^{|m?-`dVYN-2!tA%&RgA>_1B z1Pn_|BM<<8hB`j2p{j!-c~lLPZaXpgkLaa!)TYRQn#x&84fKN0Zh!`89H_VGm0qY; zJP&P)&bG1`w7iQ|dYOZYW$qQW$Hgv0<9C6zM|e%H@dUzT+T*nl3;S3JU!}!T5FzeL zk^^vzY#i{}^PU(E1mIW-h2F}GqA05EBlj>}g+oz)a-l4Y2ZlC?C<7ptXXE8Cz<7@a zB_(n(Zs##MQ3zm|m-l9hf|EHaO}w+q-)R9DB&kqK^5PKBtIr$WS!``6PHn3vvqLg-&Bg9AZvD4y*@?xGr!D@(IRD)&$Xm zYvs{@NUTR}WPsEZP>3C3_d=@gp(^J#K9k}}83;r+GG2f{E^xw@25?|!F`7^w*10Dl zda@aA=v(l89`NfCq430(t0~mB>vutSaOENV4$55=ata<71v(Jb<0-d7P??&$LTeFq zR8T9^;gR3F1d!PSROCA^a@HQN_2F|8C90VYy${qfyhN~Ey<>wiUPqT15CI>5h&H&$ z6a~5~ItKhdgb6gFVdBdsUdXW?HCcfx5(U05Dww`~)r|p_&|kj*b%wp-XZtJ#2WX0FlUjffvpM9rFVgl-iMyBADf zcvi}#&x|YQ)y&0AM9iXEnShm4A_!7Yg#gUdi=%!4IEOGx@bE?iZ-x?o><6mP)W-(; z8kTKsP|CY7WBj-QUXRnqg_Au|O>eT%a|nDgz_EL@HB{s&YtGkyIG|WuO4;hx8BDLM~`3j$%m*b$`3OB4_-zLkIlgRW zCOk)zt%pk?ija`ChJ-LG_iPi^M9jVm-Stk`*;RFo%@i+x66+(p2p(H+09g%~qUE_U z*Ed)l;!kR#Dzy*EmBhcP85Lu8BV)3_P3TJFItthCEU4ok3*ilt7V-&OJ-U(MQN;x; zjeW9YNS#d_`-zXNMMidr2LiS({N~6Ko~{l6qU7Wv0|x_!46#mcVh^n2I_K_nREs)6 zziB<IsY8p^N>!Yq%_Yw9Lc_&ok~YbQbVSC#(o<;PRLD z7}+2R;v18s7a0j=MZ#FQp{vl-#}Si(9OmkEqtWLwOEd0fQ7|J6!@6Lut1fmQ+54xq zhc5-Ye>c>=bZxdML$U4CR$jB4XA}XFL-T)yE>8lRgS4yru_+G#^s6yd@xTqE*eza~=&FL|hJF+8$i02z> z%zY8t74clMJ>?cJ zt+a6ek_$lqYImaW^5_UDEU`j0K&hy+n?6MpY&|3xmwh(`broU7ph0qp8f}f?%NTLj zFs=nEe}AQYsdO$^l->4a=Tac|wsZCV?D|T%ZC_lpPp>)$m&(~ibX)%HP-&ljQhw~5 z?t{ByupMA_y~ovY)6b-?=RM(6bK zqH}t5aB^^ZwXU2TT;Qp-tM+c^xO4T1ve04Y>VNd$lBEx{c^~KP3n19_ar;6!zrHv> zyF6glmhBdrxU&H8kMMqEy6Zr9X4tAQ&MrVX#~wKby61GlJ>V{ELisP$xRH1%i#ED0 z_(V8ep{@;=YIfJwj9{6}lseyMrP0{vMr(R8%Xsf?4L%E$;!DSd+BHnNdEPEn+9j!%VSA$iO0f(*W;FBY5`<-|b$Hg>r+)&s2V2WsU;I z^i88n9XbkJAL9|hzJ(al!wdwM?v7{62h*N0^MOGbK{C^z1M`RgC9OJC`|%h)zAaJ$ z!sGyVL~w6Cvil4I1&%G-NM5G&IKC0B#IdJ8aJ!t$1Loao0Gx(52Y) z10CbDCx*p|8PTiJh{0;%p16Ptr)}DdVf(hN;{m@&?C=4MvOOB97$roXz(>G)s$u#L zvqq}f^R3Xip++zx6NFwt>S!^1uz`sSjDviL4tg>W$NLC^>8k!{&`r`FPu~Cu;D1OE z$ql@FCILG&rLECBM*s^#^WwTxh=oD9_M1??BSQ;QOTvH{L#ruZSM09Iqfpdud5vlZJzrN` z?vC=p*H?znpuqy;y*;7 zo=&)n5^D4?QWRkW9uvkjlhI@P83mrnJH<^ez>Q9Nuv}qpfM={{gw9oGNHvjgt^+KF z;_N$4xLd{}$LwYmT&%Jn>Ux)<838K+4wuat0T_R<&eJI3(FEaE+aNU#EW#YZC(+}ce9Gf}O|SACI{bWK^^x2=B!`2rCc z6`lWmO`)rGx=eM!y#P)C7e9c5uMQ$+JF+*6vf@rapFaf~p>$Et002D!FPbiHP_foL zPAY%2IBm=L2Dl78R<`V-ZstfBW3jc`C1J`6-60i_xcK4%zx3EWSpi zdNW|R!2eOgkbvE#p)@rX&l6m(dO{Ya<)iW}=nVjwz9Qqk=Q$=kAq~5U#M{#8Pq?EH zZII`l&*_^BubiR{Pw+=U5E4Lr9$+Y#n$`F5=ujVPeOSq~KORa6oq0DsuiCfHeExs_ zgFlk_|7=k^;~3NG|1`Ez`Tvd9_wzqX`JwfFs?z-5dNSXCO8-d8KW|1WLzNz5iu`Z2 znyLCfTX-h$yZkTy=Ql9aE9jrDyi- za07=vVo9IyoxCM@N12`*&sd W{pb77_n#O3^Zx^DaNbV<90mZ?A=3E( diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/js/jsii-calc@0.7.15.jsii.tgz b/packages/jsii-pacmak/test/expected.jsii-calc/js/jsii-calc@0.7.15.jsii.tgz index 98fd2d0f53be3df1accb1b0300b13c6ef49b2b8c..ed86b811e526056a84c870825fa150c655b7fcf4 100644 GIT binary patch delta 67347 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 !!`m+{EknTQ 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 delta 67332 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 W{pb77_n#O3^Zx^DaNbV<90mZ?A=3E( diff --git a/packages/jsii-python-runtime/bin/generate-calc b/packages/jsii-python-runtime/bin/generate-calc index a062b62f44..6f71de2519 100755 --- a/packages/jsii-python-runtime/bin/generate-calc +++ b/packages/jsii-python-runtime/bin/generate-calc @@ -26,7 +26,7 @@ subprocess.run( "--find-links", os.path.abspath("."), "--find-links", - os.path.abspath(".env/jsii-calc"), + os.path.abspath(".env/jsii-calc/python"), "jsii-calc", ], check=True, From 9049136cce13cc0cbc9ff182ef0b443b64bae45c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 27 Feb 2019 18:16:23 -0500 Subject: [PATCH 109/117] Implement handling of interfaces and overrides --- packages/jsii-pacmak/lib/targets/python.ts | 46 +++++++++++++++++-- .../jsii-python-runtime/src/jsii/__init__.py | 2 + .../src/jsii/_kernel/__init__.py | 35 ++++++++------ .../jsii-python-runtime/src/jsii/_runtime.py | 8 ++++ .../tests/test_compliance.py | 5 +- 5 files changed, 78 insertions(+), 18 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8ee3532f1d..57e247f5ad 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -677,22 +677,62 @@ class TypedDictProperty implements PythonBase { interface ClassOpts extends PythonTypeOpts { abstract?: boolean; + interfaces?: spec.NamedTypeReference[]; } class Class extends BasePythonClassType { private abstract: boolean; + private interfaces: spec.NamedTypeReference[]; constructor(name: string, fqn: string, opts: ClassOpts) { super(name, fqn, opts); - const { abstract = false } = opts; + const { abstract = false, interfaces = [] } = opts; this.abstract = abstract; + this.interfaces = interfaces; + } + + public dependsOn(resolver: TypeResolver): PythonType[] { + const dependencies: PythonType[] = super.dependsOn(resolver); + const parent = resolver.getParent(this.fqn!); + + // We need to return any ifaces that are in the same module at the same level of + // nesting. + const seen: Set = new Set(); + for (const iface of this.interfaces) { + if (resolver.isInModule(iface)) { + // Given a iface, we need to locate the ifaces's parent that is the same + // as our parent, because we only care about dependencies that are at the + // same level of our own. + // TODO: We might need to recurse into our members to also find their + // dependencies. + let ifaceItem = resolver.getType(iface); + let ifaceParent = resolver.getParent(iface); + while (ifaceParent !== parent) { + ifaceItem = ifaceParent; + ifaceParent = resolver.getParent(ifaceItem.fqn!); + } + + if (!seen.has(ifaceItem.fqn!)) { + dependencies.push(ifaceItem); + seen.add(ifaceItem.fqn!); + } + } + } + + return dependencies; } public emit(code: CodeMaker, resolver: TypeResolver) { - // First we do our normal class logic for emitting our members. + // First we emit our implments decorator + if (this.interfaces.length > 0) { + const interfaces: string[] = this.interfaces.map(b => resolver.resolve(b)); + code.line(`@jsii.implements(${interfaces.join(", ")})`); + } + + // Then we do our normal class logic for emitting our members. super.emit(code, resolver); // Then, if our class is Abstract, we have to go through and redo all of @@ -1328,7 +1368,7 @@ class PythonGenerator extends Generator { const klass = new Class( toPythonIdentifier(cls.name), cls.fqn, - { abstract, bases: cls.base !== undefined ? [cls.base] : [] } + { abstract, bases: cls.base !== undefined ? [cls.base] : [], interfaces: cls.interfaces } ); if (cls.initializer !== undefined) { diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 1a213e6bcb..5c68b0e510 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -7,6 +7,7 @@ JSIIAbstractClass, enum, data_type, + implements, member, kernel, ) @@ -40,6 +41,7 @@ "Number", "enum", "data_type", + "implmenets", "member", "kernel", "load", diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 73075eea79..428eb5cc95 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -1,4 +1,5 @@ import inspect +import itertools from typing import Any, List, Optional, Type @@ -36,25 +37,31 @@ def _get_overides(klass: JSClass, obj: Any) -> List[Override]: # We need to inspect each item in the MRO, until we get to our JSClass, at that # point we'll bail, because those methods are not the overriden methods, but the # "real" methods. + jsii_classes = [klass] + list( + itertools.chain.from_iterable( + (getattr(m, "__jsii_ifaces__", []) for m in type(obj).mro()) + ) + ) for mro_klass in type(obj).mro(): if mro_klass is klass: break for name, item in mro_klass.__dict__.items(): - # We're only interested in things that also exist on the JSII class, and - # which are themselves, jsii members. - original = getattr(klass, name, _nothing) - if original is not _nothing: - if inspect.isfunction(item) and hasattr(original, "__jsii_name__"): - overrides.append( - Override(method=original.__jsii_name__, cookie=name) - ) - elif inspect.isdatadescriptor(item) and hasattr( - original.fget, "__jsii_name__" - ): - overrides.append( - Override(property_=original.fget.__jsii_name__, cookie=name) - ) + # We're only interested in things that also exist on the JSII class or + # interfaces, and which are themselves, jsii members. + for jsii_class in jsii_classes: + original = getattr(jsii_class, name, _nothing) + if original is not _nothing: + if inspect.isfunction(item) and hasattr(original, "__jsii_name__"): + overrides.append( + Override(method=original.__jsii_name__, cookie=name) + ) + elif inspect.isdatadescriptor(item) and hasattr( + original.fget, "__jsii_name__" + ): + overrides.append( + Override(property_=original.fget.__jsii_name__, cookie=name) + ) return overrides diff --git a/packages/jsii-python-runtime/src/jsii/_runtime.py b/packages/jsii-python-runtime/src/jsii/_runtime.py index da7699241f..d792d42d7d 100644 --- a/packages/jsii-python-runtime/src/jsii/_runtime.py +++ b/packages/jsii-python-runtime/src/jsii/_runtime.py @@ -99,3 +99,11 @@ def deco(fn): return fn return deco + + +def implements(*interfaces): + def deco(cls): + cls.__jsii_ifaces__ = getattr(cls, "__jsii_ifaces__", []) + list(interfaces) + return cls + + return deco diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index fd02dffb81..aba600feda 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -4,6 +4,8 @@ import pytest +import jsii + from jsii_calc import ( AbstractClassReturner, Add, @@ -127,6 +129,7 @@ def the_property(self, value): self.another_the_property = value +@jsii.implements(IFriendly) class SubclassNativeFriendlyRandom(Number): def __init__(self): super().__init__(908) @@ -685,7 +688,7 @@ def test_fail_syncOverrides_callsDoubleAsync_propertySetter(): obj.caller_is_property = 12 -@pytest.mark.xfail(reason="Unknown", strict=True) +@xfail_callbacks def test_testInterfaces(): friendly: IFriendly friendlier: IFriendlier From f3727f06b492e2ec5c868c790026879e0b70964f Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 07:39:26 -0500 Subject: [PATCH 110/117] Implement union properties --- packages/jsii-pacmak/lib/targets/python.ts | 8 ++++---- packages/jsii-python-runtime/tests/test_compliance.py | 7 ++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 57e247f5ad..b8f926278a 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -1438,6 +1438,10 @@ class PythonGenerator extends Generator { ); } + protected onUnionProperty(cls: spec.ClassType, prop: spec.Property, _union: spec.UnionTypeReference) { + this.onProperty(cls, prop); + } + protected onBeginInterface(ifc: spec.InterfaceType) { let iface: Interface | TypedDict; @@ -1511,10 +1515,6 @@ class PythonGenerator extends Generator { throw new Error("Unhandled Type: InterfaceMethodOverload"); } - protected onUnionProperty(_cls: spec.ClassType, _prop: spec.Property, _union: spec.UnionTypeReference) { - // console.log("Unhandled Type: UnionProperty"); // TODO: Handle this. - } - protected onMethodOverload(_cls: spec.ClassType, _overload: spec.Method, _originalMethod: spec.Method) { throw new Error("Unhandled Type: MethodOverload"); } diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index aba600feda..0ecd2f9d3c 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -49,9 +49,6 @@ # Tests as closely as possible to make keeping them in sync easier. # These map distinct reasons for failures, so we an easily find them. -xfail_union_property = pytest.mark.xfail( - reason="Implement union properties", strict=True -) xfail_async = pytest.mark.xfail(reason="Implement async methods", strict=True) xfail_error_handling = pytest.mark.xfail(reason="Implement Error Handling", strict=True) xfail_pure_object = pytest.mark.xfail( @@ -415,7 +412,6 @@ def test_exceptions(): assert calc3.value == 33 -@xfail_union_property def test_unionProperties(): calc3 = Calculator() calc3.union_property = Multiply(Number(9), Number(3)) @@ -423,9 +419,10 @@ def test_unionProperties(): assert isinstance(calc3.union_property, Multiply) assert calc3.read_union_value() == 9 * 3 - calc3.union_property == Power(Number(10), Number(3)) + calc3.union_property = Power(Number(10), Number(3)) assert isinstance(calc3.union_property, Power) + assert calc3.read_union_value() == 10 ** 3 def test_subclassing(): From b1a47b4e95017e224ee626d9129e0006ac342c6c Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 07:51:54 -0500 Subject: [PATCH 111/117] Fix typo --- packages/jsii-python-runtime/src/jsii/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-python-runtime/src/jsii/__init__.py b/packages/jsii-python-runtime/src/jsii/__init__.py index 5c68b0e510..14aba89137 100644 --- a/packages/jsii-python-runtime/src/jsii/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/__init__.py @@ -41,7 +41,7 @@ "Number", "enum", "data_type", - "implmenets", + "implements", "member", "kernel", "load", From 151467c9011a73d6a03b0d356113e26136eb9987 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 09:50:47 -0500 Subject: [PATCH 112/117] Implement pure native object support --- .../src/jsii/_kernel/__init__.py | 55 +++++++++++++++++-- .../src/jsii/_kernel/types.py | 2 - .../jsii-python-runtime/src/jsii/python.py | 1 - .../tests/test_compliance.py | 21 ++++--- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py index 428eb5cc95..30386dbe53 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/__init__.py @@ -1,3 +1,4 @@ +import datetime import inspect import itertools @@ -31,6 +32,10 @@ _nothing = object() +class Object: + __jsii_type__ = "Object" + + def _get_overides(klass: JSClass, obj: Any) -> List[Override]: overrides = [] @@ -57,7 +62,7 @@ def _get_overides(klass: JSClass, obj: Any) -> List[Override]: Override(method=original.__jsii_name__, cookie=name) ) elif inspect.isdatadescriptor(item) and hasattr( - original.fget, "__jsii_name__" + getattr(original, "fget", None), "__jsii_name__" ): overrides.append( Override(property_=original.fget.__jsii_name__, cookie=name) @@ -87,6 +92,24 @@ def wrapped(kernel, *args, **kwargs): return wrapped +# We need to recurse through our data structure and look for anything that the JSII +# doesn't natively handle. These items will be created as "Object" types in the JSII. +def _make_reference_for_native(kernel, d): + if isinstance(d, dict): + return {k: _make_reference_for_native(kernel, v) for k, v in d.items()} + elif isinstance(d, list): + return [_make_reference_for_native(kernel, i) for i in d] + elif hasattr(d, "__jsii_type__"): + return d + elif isinstance(d, (int, type(None), str, float, bool, datetime.datetime)): + return d + else: + d.__jsii__type__ = "Object" + kernel.create(Object, d) + _reference_map.register_reference(d) + return d + + @attr.s(auto_attribs=True, frozen=True, slots=True) class Statistics: @@ -123,7 +146,11 @@ def create( overrides = _get_overides(klass, obj) obj.__jsii_ref__ = self.provider.create( - CreateRequest(fqn=klass.__jsii_type__, args=args, overrides=overrides) + CreateRequest( + fqn=klass.__jsii_type__, + args=_make_reference_for_native(self, args), + overrides=overrides, + ) ) return obj.__jsii_ref__ @@ -139,7 +166,11 @@ def get(self, obj: Referenceable, property: str) -> Any: def set(self, obj: Referenceable, property: str, value: Any) -> None: self.provider.set( - SetRequest(objref=obj.__jsii_ref__, property_=property, value=value) + SetRequest( + objref=obj.__jsii_ref__, + property_=property, + value=_make_reference_for_native(self, value), + ) ) @_dereferenced @@ -150,7 +181,11 @@ def sget(self, klass: JSClass, property: str) -> Any: def sset(self, klass: JSClass, property: str, value: Any) -> None: self.provider.sset( - StaticSetRequest(fqn=klass.__jsii_type__, property_=property, value=value) + StaticSetRequest( + fqn=klass.__jsii_type__, + property_=property, + value=_make_reference_for_native(self, value), + ) ) @_dereferenced @@ -161,7 +196,11 @@ def invoke( args = [] return self.provider.invoke( - InvokeRequest(objref=obj.__jsii_ref__, method=method, args=args) + InvokeRequest( + objref=obj.__jsii_ref__, + method=method, + args=_make_reference_for_native(self, args), + ) ).result @_dereferenced @@ -172,7 +211,11 @@ def sinvoke( args = [] return self.provider.sinvoke( - StaticInvokeRequest(fqn=klass.__jsii_type__, method=method, args=args) + StaticInvokeRequest( + fqn=klass.__jsii_type__, + method=method, + args=_make_reference_for_native(self, args), + ) ).result def stats(self): diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/types.py b/packages/jsii-python-runtime/src/jsii/_kernel/types.py index 3a64c56fd5..2a7d278596 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/types.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/types.py @@ -240,7 +240,6 @@ class StatsResponse: class JSClass(Protocol): - @property def __jsii_type__(self) -> str: """ @@ -249,7 +248,6 @@ def __jsii_type__(self) -> str: class Referenceable(Protocol): - @property def __jsii_ref__(self) -> ObjRef: """ diff --git a/packages/jsii-python-runtime/src/jsii/python.py b/packages/jsii-python-runtime/src/jsii/python.py index d8d2d5396f..123a4daf54 100644 --- a/packages/jsii-python-runtime/src/jsii/python.py +++ b/packages/jsii-python-runtime/src/jsii/python.py @@ -29,7 +29,6 @@ def classproperty(func): class _ClassPropertyMeta(type): - def __setattr__(self, key, value): obj = getattr(self, key, None) if isinstance(obj, _ClassProperty): diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index 0ecd2f9d3c..39a81c524a 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -51,9 +51,6 @@ # These map distinct reasons for failures, so we an easily find them. xfail_async = pytest.mark.xfail(reason="Implement async methods", strict=True) xfail_error_handling = pytest.mark.xfail(reason="Implement Error Handling", strict=True) -xfail_pure_object = pytest.mark.xfail( - reason="Support sending arbitrary objects", strict=True -) xfail_literal_interface = pytest.mark.xfail( reason="Implement someone returning a literal interface", strict=True ) @@ -127,6 +124,7 @@ def the_property(self, value): @jsii.implements(IFriendly) +@jsii.implements(IRandomNumberGenerator) class SubclassNativeFriendlyRandom(Number): def __init__(self): super().__init__(908) @@ -141,7 +139,8 @@ def next(self): return next_ -class PureNativeFriendlyRandom(IFriendlyRandomGenerator): +@jsii.implements(IFriendlyRandomGenerator) +class PureNativeFriendlyRandom: """ In this case, the class does not derive from the JsiiObject hierarchy. It means that when we pass it along to javascript, we won't have an objref. This should @@ -721,7 +720,7 @@ def test_testInterfaces(): assert poly.say_hello(PureNativeFriendlyRandom()) == "oh, I am a native!" -@xfail_pure_object +@xfail_callbacks def test_testNativeObjectsWithInterfaces(): # create a pure and native object, not part of the jsii hierarchy, only implements # a jsii interface @@ -730,18 +729,18 @@ def test_testNativeObjectsWithInterfaces(): generator_bound_to_p_subclassed_object = NumberGenerator(subclassed_native) generator_bound_to_pure_native = NumberGenerator(pure_native) - assert generator_bound_to_p_subclassed_object.get_generator() is subclassed_native + assert generator_bound_to_p_subclassed_object.generator is subclassed_native generator_bound_to_p_subclassed_object.is_same_generator(subclassed_native) - assert generator_bound_to_p_subclassed_object.next_times_100() == 10000 + assert generator_bound_to_p_subclassed_object.next_times100() == 10000 # When we invoke nextTimes100 again, it will use the objref and call into the same # object. - assert generator_bound_to_p_subclassed_object.next_times_100() == 20000 + assert generator_bound_to_p_subclassed_object.next_times100() == 20000 - assert generator_bound_to_pure_native.get_generator() is pure_native + assert generator_bound_to_pure_native.generator is pure_native generator_bound_to_pure_native.is_same_generator(pure_native) - assert generator_bound_to_pure_native.next_times_100() == 100_000 - assert generator_bound_to_pure_native.next_times_100() == 200_000 + assert generator_bound_to_pure_native.next_times100() == 100_000 + assert generator_bound_to_pure_native.next_times100() == 200_000 @xfail_literal_interface From 3d2b9196cfc34ba2148d91ed1f47983b2b8f9626 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 09:58:22 -0500 Subject: [PATCH 113/117] Comment out the dependency on black for now --- packages/jsii-pacmak/lib/targets/python.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index b8f926278a..1ddc87337b 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -19,7 +19,7 @@ export default class Python extends Target { // to do it in the code generation phase, because attempting to mix style and // function makes the code generation harder to maintain and read, while doing // this here is easy. - await shell("black", ["--py36", sourceDir], {}); + // await shell("black", ["--py36", sourceDir], {}); // Actually package up our code, both as a sdist and a wheel for publishing. await shell("python3", ["setup.py", "sdist", "--dist-dir", outDir], { cwd: sourceDir }); From a989cbfc56bdc1acda48baeaf739b69c2a5c1ec1 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 14:02:08 -0500 Subject: [PATCH 114/117] Mangle parameter names --- packages/jsii-pacmak/lib/targets/python.ts | 22 +++++++++++-------- .../tests/test_compliance.py | 14 +++++++----- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 1ddc87337b..01c74a550e 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -89,6 +89,10 @@ const toPythonPropertyName = (name: string, constant: boolean = false, protected return value; }; +const toPythonParameterName = (name: string): string => { + return toPythonIdentifier(toSnakeCase(name)); +}; + const setDifference = (setA: Set, setB: Set): Set => { const difference = new Set(setA); for (const elem of setB) { @@ -342,7 +346,7 @@ abstract class BaseMethod implements PythonBase { && this.liftedProp.properties !== undefined && this.liftedProp.properties.length >= 1) { for (const prop of this.liftedProp.properties) { - liftedPropNames.add(toPythonIdentifier(prop.name)); + liftedPropNames.add(toPythonParameterName(prop.name)); } } @@ -355,7 +359,7 @@ abstract class BaseMethod implements PythonBase { // initializers, because our keyword lifting will allow two names to clash. // This can hopefully be removed once we get https://github.com/awslabs/jsii/issues/288 // resolved. - let paramName: string = toPythonIdentifier(param.name); + let paramName: string = toPythonParameterName(param.name); while (liftedPropNames.has(paramName)) { paramName = `${paramName}_`; } @@ -380,7 +384,7 @@ abstract class BaseMethod implements PythonBase { // Iterate over all of our props, and reflect them into our params. for (const prop of this.liftedProp.properties) { - const paramName = toPythonIdentifier(prop.name); + const paramName = toPythonParameterName(prop.name); const paramType = resolver.resolve(prop.type, { forwardReferences: false }); const paramDefault = prop.type.optional ? "=None" : ""; @@ -394,7 +398,7 @@ abstract class BaseMethod implements PythonBase { pythonParams.pop(); const lastParameter = this.parameters.slice(-1)[0]; - const paramName = toPythonIdentifier(lastParameter.name); + const paramName = toPythonParameterName(lastParameter.name); const paramType = resolver.resolve( lastParameter.type, { forwardReferences: false, ignoreOptional: true }, @@ -434,7 +438,7 @@ abstract class BaseMethod implements PythonBase { private emitAutoProps(code: CodeMaker, resolver: TypeResolver) { const lastParameter = this.parameters.slice(-1)[0]; - const argName = toPythonIdentifier(lastParameter.name); + const argName = toPythonParameterName(lastParameter.name); const typeName = resolver.resolve(lastParameter.type, {ignoreOptional: true }); // We need to build up a list of properties, which are mandatory, these are the @@ -445,7 +449,7 @@ abstract class BaseMethod implements PythonBase { continue; } - mandatoryPropMembers.push(`"${toPythonIdentifier(prop.name)}": ${toPythonIdentifier(prop.name)}`); + mandatoryPropMembers.push(`"${prop.name}": ${toPythonParameterName(prop.name)}`); } code.line(`${argName}: ${typeName} = {${mandatoryPropMembers.join(", ")}}`); code.line(); @@ -457,8 +461,8 @@ abstract class BaseMethod implements PythonBase { continue; } - code.openBlock(`if ${toPythonIdentifier(prop.name)} is not None`); - code.line(`${argName}["${toPythonIdentifier(prop.name)}"] = ${toPythonIdentifier(prop.name)}`); + code.openBlock(`if ${toPythonParameterName(prop.name)} is not None`); + code.line(`${argName}["${prop.name}"] = ${toPythonParameterName(prop.name)}`); code.closeBlock(); } } @@ -480,7 +484,7 @@ abstract class BaseMethod implements PythonBase { const paramNames: string[] = []; for (const param of this.parameters) { - paramNames.push(toPythonIdentifier(param.name)); + paramNames.push(toPythonParameterName(param.name)); } code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index 39a81c524a..b7770347ce 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -298,7 +298,7 @@ def test_unionTypes(): def test_createObjectAndCtorOverloads(): Calculator() - Calculator(maximumValue=10) + Calculator(maximum_value=10) def test_getSetPrimitiveProperties(): @@ -397,7 +397,7 @@ def test_maps(): def test_exceptions(): - calc3 = Calculator(initialValue=20, maximumValue=30) + calc3 = Calculator(initial_value=20, maximum_value=30) calc3.add(3) assert calc3.value == 23 @@ -640,7 +640,7 @@ def read_write_string(self, value): def test_interfaceBuilder(): interact = UsesInterfaceWithProperties( - readOnlyString="READ_ONLY", readWriteString="READ_WRITE" + read_only_string="READ_ONLY", read_write_string="READ_WRITE" ) assert interact.just_read() == "READ_ONLY" assert interact.write_and_read("Hello") == "Hello" @@ -874,8 +874,12 @@ def test_nullShouldBeTreatedAsUndefined(): obj = NullShouldBeTreatedAsUndefined("hello", None) obj.give_me_undefined(None) obj.give_me_undefined_inside_an_object( - thisShouldBeUndefined=None, - arrayWithThreeElementsAndUndefinedAsSecondArgument=["hello", None, "boom"], + this_should_be_undefined=None, + array_with_three_elements_and_undefined_as_second_argument=[ + "hello", + None, + "boom", + ], ) obj.change_me_to_undefined = None obj.verify_property_is_undefined() From b15f91f48ceb071603ffa9e2a1612c99cd769201 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 5 Mar 2019 16:35:42 -0500 Subject: [PATCH 115/117] Implement some basic error handling --- .../src/jsii/_kernel/providers/process.py | 3 ++- packages/jsii-python-runtime/src/jsii/errors.py | 14 ++++++++++++++ .../jsii-python-runtime/tests/test_compliance.py | 1 - packages/jsii-python-runtime/tests/test_python.py | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 packages/jsii-python-runtime/src/jsii/errors.py create mode 100644 packages/jsii-python-runtime/tests/test_python.py diff --git a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py index 32051b8a3c..bc417af56b 100644 --- a/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py +++ b/packages/jsii-python-runtime/src/jsii/_kernel/providers/process.py @@ -45,6 +45,7 @@ StatsRequest, StatsResponse, ) +from jsii.errors import JSIIError, JavaScriptError @attr.s(auto_attribs=True, frozen=True, slots=True) @@ -298,7 +299,7 @@ def send( if isinstance(resp, _OkayResponse): return self._serializer.structure(resp.ok, response_type) else: - raise NotImplementedError + raise JSIIError(resp.error) from JavaScriptError(resp.stack) class ProcessKernel(BaseKernel): diff --git a/packages/jsii-python-runtime/src/jsii/errors.py b/packages/jsii-python-runtime/src/jsii/errors.py new file mode 100644 index 0000000000..2a698cce07 --- /dev/null +++ b/packages/jsii-python-runtime/src/jsii/errors.py @@ -0,0 +1,14 @@ +import textwrap + + +class JSIIError(Exception): + pass + + +class JavaScriptError(Exception): + + def __init__(self, stack): + self.stack = stack + + def __str__(self): + return "\n" + textwrap.indent(self.stack, " ", lambda line: bool(line)) diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index b7770347ce..13e1cacfea 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -50,7 +50,6 @@ # These map distinct reasons for failures, so we an easily find them. xfail_async = pytest.mark.xfail(reason="Implement async methods", strict=True) -xfail_error_handling = pytest.mark.xfail(reason="Implement Error Handling", strict=True) xfail_literal_interface = pytest.mark.xfail( reason="Implement someone returning a literal interface", strict=True ) diff --git a/packages/jsii-python-runtime/tests/test_python.py b/packages/jsii-python-runtime/tests/test_python.py new file mode 100644 index 0000000000..1be5b4c191 --- /dev/null +++ b/packages/jsii-python-runtime/tests/test_python.py @@ -0,0 +1,15 @@ +import jsii +import pytest + +from jsii.errors import JSIIError +from jsii_calc import Calculator + + +class TestErrorHandling: + def test_jsii_error(self): + obj = Calculator() + + with pytest.raises( + JSIIError, match="Class jsii-calc.Calculator doesn't have a method" + ): + jsii.kernel.invoke(obj, "nonexistentMethod") From 79bd713e0ee467389456aa73fa48101bdd8329c4 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Mar 2019 13:47:17 -0500 Subject: [PATCH 116/117] Temporary pip install --- install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install.sh b/install.sh index a1ad4ca192..c079b935f1 100755 --- a/install.sh +++ b/install.sh @@ -1,6 +1,8 @@ #!/bin/bash set -euo pipefail +pip install wheel + export NODE_OPTIONS="--max-old-space-size=4096 ${NODE_OPTIONS:-}" if ! npm ci --help; then From 61ff7c16c7b0513f5123fecb6b28294f160c889e Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 7 Mar 2019 14:00:48 -0500 Subject: [PATCH 117/117] Revert "Temporary pip install" This reverts commit 79bd713e0ee467389456aa73fa48101bdd8329c4. --- install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install.sh b/install.sh index c079b935f1..a1ad4ca192 100755 --- a/install.sh +++ b/install.sh @@ -1,8 +1,6 @@ #!/bin/bash set -euo pipefail -pip install wheel - export NODE_OPTIONS="--max-old-space-size=4096 ${NODE_OPTIONS:-}" if ! npm ci --help; then