mirror of https://github.com/grpc/grpc-node.git
Delete templates for grpc-native-core directory
This commit is contained in:
parent
58afa5ed7d
commit
690848648d
|
|
@ -1,420 +0,0 @@
|
||||||
%YAML 1.2
|
|
||||||
--- |
|
|
||||||
# GRPC Node gyp file
|
|
||||||
# This currently builds the Node extension and dependencies
|
|
||||||
# This file has been automatically generated from a template file.
|
|
||||||
# Please look at the templates directory instead.
|
|
||||||
# This file can be regenerated from the template by running
|
|
||||||
# tools/buildgen/generate_projects.sh
|
|
||||||
|
|
||||||
# Copyright 2015 gRPC authors.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
<%
|
|
||||||
def gyp_target_name(lib_name):
|
|
||||||
if lib_name.startswith("absl/"):
|
|
||||||
return lib_name.replace("/", "__").replace(":", "__")
|
|
||||||
else:
|
|
||||||
return lib_name
|
|
||||||
%>
|
|
||||||
# Some of this file is built with the help of
|
|
||||||
# https://n8.io/converting-a-c-library-to-gyp/
|
|
||||||
{
|
|
||||||
'variables': {
|
|
||||||
'runtime%': 'node',
|
|
||||||
# Some Node installations use the system installation of OpenSSL, and on
|
|
||||||
# some systems, the system OpenSSL still does not have ALPN support. This
|
|
||||||
# will let users recompile gRPC to work without ALPN.
|
|
||||||
'grpc_alpn%': 'true',
|
|
||||||
# Indicates that the library should be built with gcov.
|
|
||||||
'grpc_gcov%': 'false',
|
|
||||||
# Indicates that the library should be built with compatibility for musl
|
|
||||||
# libc, so that it can run on Alpine Linux. This is only necessary if not
|
|
||||||
# building on Alpine Linux
|
|
||||||
'grpc_alpine%': 'false'
|
|
||||||
},
|
|
||||||
'target_defaults': {
|
|
||||||
'configurations': {
|
|
||||||
% for name, args in configs.iteritems():
|
|
||||||
% if name in ['dbg', 'opt']:
|
|
||||||
'${{'dbg':'Debug', 'opt': 'Release'}[name]}': {
|
|
||||||
% for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines')]:
|
|
||||||
% if args.get(arg, None) is not None:
|
|
||||||
'${prop}': [
|
|
||||||
% for item in args.get(arg).split():
|
|
||||||
'${item}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
},
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
},
|
|
||||||
% for arg, prop in [('CPPFLAGS', 'cflags'), ('LDFLAGS', 'ldflags')]:
|
|
||||||
% if defaults['global'].get(arg, None) is not None:
|
|
||||||
'${prop}': [
|
|
||||||
% for item in defaults['global'].get(arg).split() + (['-fvisibility=hidden'] if arg == 'CPPFLAGS' else []):
|
|
||||||
'${item}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
'cflags_c': [
|
|
||||||
'-std=c99'
|
|
||||||
],
|
|
||||||
'cflags_cc': [
|
|
||||||
'-std=c++1y'
|
|
||||||
],
|
|
||||||
'include_dirs': [
|
|
||||||
'deps/grpc',
|
|
||||||
'deps/grpc/include',
|
|
||||||
'deps/grpc/src/core/ext/upb-generated',
|
|
||||||
'deps/grpc/third_party/abseil-cpp',
|
|
||||||
'deps/grpc/third_party/address_sorting/include',
|
|
||||||
'deps/grpc/third_party/cares',
|
|
||||||
'deps/grpc/third_party/cares/cares',
|
|
||||||
'deps/grpc/third_party/upb',
|
|
||||||
'deps/grpc/third_party/upb/generated_for_cmake',
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'GPR_BACKWARDS_COMPATIBILITY_MODE',
|
|
||||||
'GRPC_ARES=1',
|
|
||||||
'GRPC_UV',
|
|
||||||
'GRPC_NODE_VERSION="${settings.get('node_version', settings.version)}"',
|
|
||||||
'CARES_STATICLIB',
|
|
||||||
'CARES_SYMBOL_HIDING'
|
|
||||||
],
|
|
||||||
'defines!': [
|
|
||||||
'OPENSSL_THREADS'
|
|
||||||
],
|
|
||||||
'conditions': [
|
|
||||||
['grpc_gcov=="true"', {
|
|
||||||
% for arg, prop in [('CPPFLAGS', 'cflags'), ('DEFINES', 'defines'), ('LDFLAGS', 'ldflags')]:
|
|
||||||
% if configs['gcov'].get(arg, None) is not None:
|
|
||||||
'${prop}': [
|
|
||||||
% for item in configs['gcov'].get(arg).split():
|
|
||||||
'${item}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
}],
|
|
||||||
['grpc_alpine=="true"', {
|
|
||||||
'defines': [
|
|
||||||
'GPR_MUSL_LIBC_COMPAT'
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
# This is the condition for using boringssl
|
|
||||||
['OS=="win" or runtime=="electron"', {
|
|
||||||
"include_dirs": [
|
|
||||||
"deps/grpc/third_party/boringssl/include"
|
|
||||||
],
|
|
||||||
"defines": [
|
|
||||||
'OPENSSL_NO_ASM'
|
|
||||||
]
|
|
||||||
}, {
|
|
||||||
'conditions': [
|
|
||||||
["target_arch=='ia32'", {
|
|
||||||
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/piii" ]
|
|
||||||
}],
|
|
||||||
["target_arch=='x64'", {
|
|
||||||
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/k8" ]
|
|
||||||
}],
|
|
||||||
["target_arch=='arm'", {
|
|
||||||
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/arm" ]
|
|
||||||
}],
|
|
||||||
['grpc_alpn=="true"', {
|
|
||||||
'defines': [
|
|
||||||
'TSI_OPENSSL_ALPN_SUPPORT=1'
|
|
||||||
],
|
|
||||||
}, {
|
|
||||||
'defines': [
|
|
||||||
'TSI_OPENSSL_ALPN_SUPPORT=0'
|
|
||||||
],
|
|
||||||
}]
|
|
||||||
],
|
|
||||||
'include_dirs': [
|
|
||||||
'<(node_root_dir)/deps/openssl/openssl/include',
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "win"', {
|
|
||||||
"include_dirs": [
|
|
||||||
"deps/grpc/third_party/zlib"
|
|
||||||
],
|
|
||||||
"defines": [
|
|
||||||
'_WIN32_WINNT=0x0600',
|
|
||||||
'WIN32_LEAN_AND_MEAN',
|
|
||||||
'_HAS_EXCEPTIONS=0',
|
|
||||||
'UNICODE',
|
|
||||||
'_UNICODE',
|
|
||||||
'NOMINMAX',
|
|
||||||
],
|
|
||||||
"msvs_settings": {
|
|
||||||
'VCCLCompilerTool': {
|
|
||||||
'RuntimeLibrary': 1, # static debug
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"libraries": [
|
|
||||||
"ws2_32"
|
|
||||||
]
|
|
||||||
}, { # OS != "win"
|
|
||||||
'include_dirs': [
|
|
||||||
'<(node_root_dir)/deps/zlib'
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "mac"', {
|
|
||||||
'xcode_settings': {
|
|
||||||
% if defaults['global'].get('CPPFLAGS', None) is not None:
|
|
||||||
'OTHER_CFLAGS': [
|
|
||||||
% for item in defaults['global'].get('CPPFLAGS').split() + ['-fvisibility=hidden']:
|
|
||||||
'${item}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'OTHER_CPLUSPLUSFLAGS': [
|
|
||||||
% for item in defaults['global'].get('CPPFLAGS').split() + ['-fvisibility=hidden']:
|
|
||||||
'${item}',
|
|
||||||
% endfor
|
|
||||||
'-stdlib=libc++',
|
|
||||||
'-std=c++1y',
|
|
||||||
'-Wno-error=deprecated-declarations'
|
|
||||||
],
|
|
||||||
% endif
|
|
||||||
},
|
|
||||||
}]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'conditions': [
|
|
||||||
['OS=="win" or runtime=="electron"', {
|
|
||||||
'targets': [
|
|
||||||
% for lib in libs:
|
|
||||||
% if lib.name == 'boringssl':
|
|
||||||
{
|
|
||||||
'target_name': '${lib.name}',
|
|
||||||
'product_prefix': 'lib',
|
|
||||||
'type': 'static_library',
|
|
||||||
'cflags': [
|
|
||||||
'-Wno-implicit-fallthrough'
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'_XOPEN_SOURCE=700'
|
|
||||||
],
|
|
||||||
'dependencies': [
|
|
||||||
% for dep in getattr(lib, 'deps', []):
|
|
||||||
'${dep}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'sources': [
|
|
||||||
% for source in lib.src:
|
|
||||||
'deps/grpc/${source}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'conditions': [
|
|
||||||
['OS == "mac"', {
|
|
||||||
'xcode_settings': {
|
|
||||||
'MACOSX_DEPLOYMENT_TARGET': '10.9'
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
}],
|
|
||||||
['OS == "win" and runtime!="electron"', {
|
|
||||||
'targets': [
|
|
||||||
{
|
|
||||||
# IMPORTANT WINDOWS BUILD INFORMATION
|
|
||||||
# This library does not build on Windows without modifying the Node
|
|
||||||
# development packages that node-gyp downloads in order to build.
|
|
||||||
# Due to https://github.com/nodejs/node/issues/4932, the headers for
|
|
||||||
# BoringSSL conflict with the OpenSSL headers included by default
|
|
||||||
# when including the Node headers. The remedy for this is to remove
|
|
||||||
# the OpenSSL headers, from the downloaded Node development package,
|
|
||||||
# which is typically located in `.node-gyp` in your home directory.
|
|
||||||
#
|
|
||||||
# This is not true of Electron, which does not have OpenSSL headers.
|
|
||||||
'target_name': 'WINDOWS_BUILD_WARNING',
|
|
||||||
'rules': [
|
|
||||||
{
|
|
||||||
'rule_name': 'WINDOWS_BUILD_WARNING',
|
|
||||||
'extension': 'S',
|
|
||||||
'inputs': [
|
|
||||||
'package.json'
|
|
||||||
],
|
|
||||||
'outputs': [
|
|
||||||
'ignore_this_part'
|
|
||||||
],
|
|
||||||
'action': ['echo', 'IMPORTANT: Due to https://github.com/nodejs/node/issues/4932, to build this library on Windows, you must first remove <(node_root_dir)/include/node/openssl/']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "win"', {
|
|
||||||
'targets': [
|
|
||||||
# Only want to compile zlib under Windows
|
|
||||||
% for lib in libs:
|
|
||||||
% if lib.name == 'z':
|
|
||||||
{
|
|
||||||
'target_name': '${lib.name}',
|
|
||||||
'product_prefix': 'lib',
|
|
||||||
'type': 'static_library',
|
|
||||||
'dependencies': [
|
|
||||||
% for dep in getattr(lib, 'deps', []):
|
|
||||||
'${dep}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'sources': [
|
|
||||||
% for source in lib.src:
|
|
||||||
'deps/grpc/${source}',
|
|
||||||
% endfor
|
|
||||||
]
|
|
||||||
},
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
],
|
|
||||||
'targets': [
|
|
||||||
% for lib in libs:
|
|
||||||
% if lib.name == 'ares':
|
|
||||||
{
|
|
||||||
'target_name': '${lib.name}',
|
|
||||||
'product_prefix': 'lib',
|
|
||||||
'type': 'static_library',
|
|
||||||
'sources': [
|
|
||||||
% for source in lib.src:
|
|
||||||
'deps/grpc/${source}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'_GNU_SOURCE'
|
|
||||||
],
|
|
||||||
'conditions': [
|
|
||||||
['OS == "mac"', {
|
|
||||||
'xcode_settings': {
|
|
||||||
'MACOSX_DEPLOYMENT_TARGET': '10.9'
|
|
||||||
},
|
|
||||||
'include_dirs': [
|
|
||||||
'deps/grpc/third_party/cares/config_darwin'
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'HAVE_CONFIG_H'
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "linux"', {
|
|
||||||
'include_dirs': [
|
|
||||||
'deps/grpc/third_party/cares/config_linux'
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'HAVE_CONFIG_H'
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "win"', {
|
|
||||||
'include_dirs': [
|
|
||||||
'deps/grpc/third_party/cares/config_windows'
|
|
||||||
],
|
|
||||||
'defines': [
|
|
||||||
'HAVE_CONFIG_H'
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
% for core in libs:
|
|
||||||
% if core.name == 'grpc' or core.name == 'address_sorting':
|
|
||||||
% for lib in libs:
|
|
||||||
% if lib.name == core.name or (lib.name in core.transitive_deps and lib.name not in ('boringssl', 'z')):
|
|
||||||
{
|
|
||||||
'target_name': '${gyp_target_name(lib.name)}',
|
|
||||||
'product_prefix': 'lib',
|
|
||||||
'type': 'static_library',
|
|
||||||
'dependencies': [
|
|
||||||
% for dep in getattr(lib, 'deps', []):
|
|
||||||
'${gyp_target_name(dep)}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'sources': [
|
|
||||||
% for source in lib.src:
|
|
||||||
'deps/grpc/${source}',
|
|
||||||
% endfor
|
|
||||||
],
|
|
||||||
'conditions': [
|
|
||||||
['OS == "mac"', {
|
|
||||||
'xcode_settings': {
|
|
||||||
'MACOSX_DEPLOYMENT_TARGET': '10.9'
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
{
|
|
||||||
'include_dirs': [
|
|
||||||
"<!(node -e \"require('nan')\")"
|
|
||||||
],
|
|
||||||
'cflags': [
|
|
||||||
'-pthread',
|
|
||||||
'-Wno-error=deprecated-declarations',
|
|
||||||
'-Wno-cast-function-type'
|
|
||||||
],
|
|
||||||
"conditions": [
|
|
||||||
['OS=="win" or runtime=="electron"', {
|
|
||||||
'dependencies': [
|
|
||||||
"boringssl",
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS=="win"', {
|
|
||||||
'dependencies': [
|
|
||||||
"z",
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS=="linux"', {
|
|
||||||
'ldflags': [
|
|
||||||
'-Wl,-wrap,memcpy'
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
['OS == "mac"', {
|
|
||||||
'xcode_settings': {
|
|
||||||
'MACOSX_DEPLOYMENT_TARGET': '10.9'
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
],
|
|
||||||
"target_name": "grpc_node",
|
|
||||||
"sources": [
|
|
||||||
"<!@(node -p \"require('fs').readdirSync('./ext').map(f=>'ext/'+f).join(' ')\")"
|
|
||||||
],
|
|
||||||
"dependencies": [
|
|
||||||
"grpc",
|
|
||||||
"gpr",
|
|
||||||
"ares",
|
|
||||||
"address_sorting"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"target_name": "action_after_build",
|
|
||||||
"type": "none",
|
|
||||||
"dependencies": [ "<(module_name)" ],
|
|
||||||
"copies": [
|
|
||||||
{
|
|
||||||
"files": [ "<(PRODUCT_DIR)/<(module_name).node"],
|
|
||||||
"destination": "<(module_path)"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
%YAML 1.2
|
|
||||||
--- |
|
|
||||||
{
|
|
||||||
"name": "grpc",
|
|
||||||
"version": "${settings.get('node_version', settings.version)}",
|
|
||||||
"author": "Google Inc.",
|
|
||||||
"description": "gRPC Library for Node",
|
|
||||||
"homepage": "https://grpc.io/",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/grpc/grpc-node.git"
|
|
||||||
},
|
|
||||||
"bugs": "https://github.com/grpc/grpc-node/issues",
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Michael Lumish",
|
|
||||||
"email": "mlumish@google.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"directories": {
|
|
||||||
"lib": "src"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"build": "node-pre-gyp build",
|
|
||||||
"electron-build": "node-pre-gyp configure build --runtime=electron --disturl=https://atom.io/download/atom-shell",
|
|
||||||
"coverage": "istanbul cover ./node_modules/.bin/_mocha test",
|
|
||||||
"install": "node-pre-gyp install --fallback-to-build --library=static_library",
|
|
||||||
"prepack": "git submodule update --init --recursive && npm install"
|
|
||||||
},
|
|
||||||
"bundledDependencies": [
|
|
||||||
"node-pre-gyp"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"@types/bytebuffer": "^5.0.40",
|
|
||||||
"lodash.camelcase": "^4.3.0",
|
|
||||||
"lodash.clone": "^4.5.0",
|
|
||||||
"nan": "^2.13.2",
|
|
||||||
"node-pre-gyp": "^0.14.0",
|
|
||||||
"protobufjs": "^5.0.3"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"body-parser": "^1.15.2",
|
|
||||||
"electron-mocha": "^3.1.1",
|
|
||||||
"express": "^4.14.0",
|
|
||||||
"google-protobuf": "^3.0.0",
|
|
||||||
"istanbul": "^0.4.4",
|
|
||||||
"lodash": "^4.17.4",
|
|
||||||
"minimist": "^1.1.0",
|
|
||||||
"node-forge": "^0.7.5",
|
|
||||||
"poisson-process": "^0.2.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
},
|
|
||||||
"binary": {
|
|
||||||
"module_name": "grpc_node",
|
|
||||||
"module_path": "src/node/extension_binary/{node_abi}-{platform}-{arch}-{libc}",
|
|
||||||
"host": "https://node-precompiled-binaries.grpc.io/",
|
|
||||||
"remote_path": "{name}/v{version}",
|
|
||||||
"package_name": "{node_abi}-{platform}-{arch}-{libc}.tar.gz"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"LICENSE",
|
|
||||||
"README.md",
|
|
||||||
"deps/grpc/etc/",
|
|
||||||
"index.js",
|
|
||||||
"index.d.ts",
|
|
||||||
"src/*.js",
|
|
||||||
"ext/*.{cc,h}",
|
|
||||||
"deps/grpc/include/grpc/**/*.h",
|
|
||||||
"deps/grpc/src/core/**/*.{c,cc,h}",
|
|
||||||
"deps/grpc/src/boringssl/err_data.c",
|
|
||||||
"deps/grpc/third_party/abseil-cpp/absl/**/*.{cc,h,inc}",
|
|
||||||
"deps/grpc/third_party/boringssl/crypto/**/*.{c,cc,h}",
|
|
||||||
"deps/grpc/third_party/boringssl/include/**/*.{c,cc,h}",
|
|
||||||
"deps/grpc/third_party/boringssl/ssl/**/*.{c,cc,h}",
|
|
||||||
"deps/grpc/third_party/boringssl/third_party/**/*.{c,h}",
|
|
||||||
"deps/grpc/third_party/upb/**/*.{c,h,inc}",
|
|
||||||
"deps/grpc/third_party/zlib/**/*.{c,cc,h}",
|
|
||||||
"deps/grpc/third_party/address_sorting/**/*.{c,h}",
|
|
||||||
"deps/grpc/third_party/cares/**/*.{c,h}",
|
|
||||||
"binding.gyp"
|
|
||||||
],
|
|
||||||
"main": "index.js",
|
|
||||||
"typings": "index.d.ts",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"jshintConfig": {
|
|
||||||
"bitwise": true,
|
|
||||||
"curly": true,
|
|
||||||
"eqeqeq": true,
|
|
||||||
"esnext": true,
|
|
||||||
"freeze": true,
|
|
||||||
"immed": true,
|
|
||||||
"indent": 2,
|
|
||||||
"latedef": "nofunc",
|
|
||||||
"maxlen": 80,
|
|
||||||
"mocha": true,
|
|
||||||
"newcap": true,
|
|
||||||
"node": true,
|
|
||||||
"noarg": true,
|
|
||||||
"quotmark": "single",
|
|
||||||
"strict": true,
|
|
||||||
"trailing": true,
|
|
||||||
"undef": true,
|
|
||||||
"unused": "vars"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue