taxtank-core 0.29.35 → 0.29.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundles/taxtank-core.umd.js +154 -76
  2. package/bundles/taxtank-core.umd.js.map +1 -1
  3. package/esm2015/lib/collections/collection.js +18 -5
  4. package/esm2015/lib/collections/property/property.collection.js +2 -2
  5. package/esm2015/lib/collections/subscription/service-product.collection.js +4 -1
  6. package/esm2015/lib/collections/subscription/service-subscription.collection.js +4 -1
  7. package/esm2015/lib/db/Enums/chart-accounts/chart-accounts-list.enum.js +2 -1
  8. package/esm2015/lib/forms/transaction/index.js +3 -2
  9. package/esm2015/lib/forms/transaction/transaction.form.js +5 -2
  10. package/esm2015/lib/forms/transaction/work/work-expense.form.js +21 -0
  11. package/esm2015/lib/forms/transaction/work/work-income.form.js +87 -0
  12. package/esm2015/lib/forms/transaction/work/work-transaction.form.js +40 -0
  13. package/esm2015/lib/models/chart-accounts/chart-accounts.js +2 -2
  14. package/esm2015/lib/services/http/user/user.service.js +2 -2
  15. package/fesm2015/taxtank-core.js +133 -76
  16. package/fesm2015/taxtank-core.js.map +1 -1
  17. package/lib/collections/collection.d.ts +6 -2
  18. package/lib/collections/subscription/service-product.collection.d.ts +1 -0
  19. package/lib/collections/subscription/service-subscription.collection.d.ts +1 -0
  20. package/lib/db/Enums/chart-accounts/chart-accounts-list.enum.d.ts +1 -0
  21. package/lib/forms/transaction/index.d.ts +2 -1
  22. package/lib/forms/transaction/work/work-expense.form.d.ts +6 -0
  23. package/lib/forms/transaction/{work-income.form.d.ts → work/work-income.form.d.ts} +4 -8
  24. package/lib/forms/transaction/work/work-transaction.form.d.ts +15 -0
  25. package/package.json +1 -1
  26. package/esm2015/lib/forms/transaction/work-income.form.js +0 -109
@@ -39,9 +39,13 @@ export declare class Collection<Model extends AbstractModel> implements Iterable
39
39
  findBy(path: string, value: any): Model | null;
40
40
  findIndexBy(path: string, value: any): number;
41
41
  push(...items: Model[]): this;
42
- replaceBy(path: string, value: any, item: Model): this;
43
- remove(items: Model[]): this;
42
+ remove(...items: Model[]): this;
43
+ /**
44
+ * @TODO it's filter, not remove
45
+ */
44
46
  removeBy(path: string, values: any): this;
47
+ replaceBy(path: string, value: any, item: Model): this;
48
+ diff(items: Model[]): this;
45
49
  minBy(path: string): Model;
46
50
  maxBy(path: string): Model;
47
51
  reduce(callback: (sum: number, item: Model) => number, init?: number): number;
@@ -1,5 +1,6 @@
1
1
  import { Collection } from '../collection';
2
2
  import { ServiceProduct } from '../../models';
3
3
  export declare class ServiceProductCollection extends Collection<ServiceProduct> {
4
+ get title(): string;
4
5
  getActive(): this;
5
6
  }
@@ -8,6 +8,7 @@ export declare class ServiceSubscriptionCollection extends Collection<ServiceSub
8
8
  getTrials(): this;
9
9
  getActiveTrials(): this;
10
10
  getExpiredTrials(): this;
11
+ getExpiredAfter(date?: Date): this;
11
12
  getPaid(): this;
12
13
  getActivePaid(): ServiceSubscription;
13
14
  /**
@@ -1,4 +1,5 @@
1
1
  export declare enum ChartAccountsListEnum {
2
+ HOME_OFFICE_WORK_HOURS = 103,
2
3
  PARTNERSHIP_EXPENSES = 156,
3
4
  TRUST_EXPENSES = 157,
4
5
  INTEREST_CHARGED_BY_ATO = 278,
@@ -1,3 +1,4 @@
1
1
  export * from './transaction-base.form';
2
2
  export * from './transaction.form';
3
- export * from './work-income.form';
3
+ export * from './work/work-income.form';
4
+ export * from './work/work-expense.form';
@@ -0,0 +1,6 @@
1
+ import { IEventListener } from '../../../interfaces';
2
+ import { WorkTransactionForm } from './work-transaction.form';
3
+ export declare class WorkExpenseForm extends WorkTransactionForm implements IEventListener {
4
+ listenEvents(): void;
5
+ watchChartAccountsMetadata(): void;
6
+ }
@@ -1,16 +1,12 @@
1
- import { TransactionForm } from './transaction.form';
2
- import { Transaction, TransactionAllocation } from '../../models';
3
- import { IEventListener } from '../../interfaces/event-listener.interface';
4
- export declare class WorkIncomeForm extends TransactionForm implements IEventListener {
1
+ import { Transaction, TransactionAllocation } from '../../../models';
2
+ import { IEventListener } from '../../../interfaces';
3
+ import { WorkTransactionForm } from './work-transaction.form';
4
+ export declare class WorkIncomeForm extends WorkTransactionForm implements IEventListener {
5
5
  constructor(transaction: Transaction, registeredForGst: boolean, allocations: TransactionAllocation[]);
6
6
  listenEvents(): void;
7
7
  private watchIncomeSource;
8
8
  private updateTaxValue;
9
9
  watchChartAccounts(): void;
10
- /**
11
- * depends on chartAccounts the form could include different extra fields
12
- */
13
- private buildMetadataForm;
14
10
  /**
15
11
  * salary comes to bankAccount together with related transactions like tips (kind of salary, but reported in different tax summary section),
16
12
  * adjustments used to clarify received payment by separating it into multiple transactions,
@@ -0,0 +1,15 @@
1
+ import { TransactionForm } from '../transaction.form';
2
+ import { IEventListener } from '../../../interfaces';
3
+ import { Transaction, TransactionAllocation } from '../../../models';
4
+ import { AbstractControl } from '@angular/forms';
5
+ export declare abstract class WorkTransactionForm extends TransactionForm implements IEventListener {
6
+ constructor(transaction: Transaction, registeredForGst: boolean, allocations: TransactionAllocation[], controls?: {
7
+ [key: string]: AbstractControl;
8
+ });
9
+ listenEvents(): void;
10
+ watchChartAccounts(): void;
11
+ /**
12
+ * depends on chartAccounts the form could include different extra fields
13
+ */
14
+ private buildMetadataForm;
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taxtank-core",
3
- "version": "0.29.35",
3
+ "version": "0.29.37",
4
4
  "private": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^12.2.3 || ~13.0.0",
@@ -1,109 +0,0 @@
1
- import { TransactionForm } from './transaction.form';
2
- import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
3
- import { IncomeSource } from '../../models/income-source/income-source';
4
- import { autocompleteValidator } from '../../validators';
5
- import { Collection } from '../../collections';
6
- import { TransactionOperationEnum } from '../../db/Enums/transaction-operation.enum';
7
- export class WorkIncomeForm extends TransactionForm {
8
- constructor(transaction, registeredForGst, allocations) {
9
- var _a;
10
- // for work income we need to show netAmount instead of amount (because some adjustments are included in amount)
11
- transaction.amount = transaction.netAmount;
12
- super(transaction, registeredForGst, allocations, {
13
- // additional data related to work income (like tax instalments)
14
- metadata: new FormArray((transaction.metadata || []).map((transactionMetadata) => {
15
- return new FormGroup({
16
- value: new FormControl(transactionMetadata.value),
17
- chartAccountsMetadata: new FormControl(transactionMetadata.chartAccountsMetadata)
18
- });
19
- })),
20
- tax: new FormControl({
21
- value: transaction.tax,
22
- disabled: !transaction.chartAccounts || transaction.chartAccounts.isNRAS(),
23
- }, Validators.required),
24
- incomeSource: new FormControl(transaction.incomeSource, [Validators.required, autocompleteValidator()]),
25
- });
26
- // forbid to edit some fields for allocated transaction
27
- if (allocations.length) {
28
- this.get('chartAccounts').disable();
29
- }
30
- // adjustments allowed only for salary
31
- if (!((_a = transaction.chartAccounts) === null || _a === void 0 ? void 0 : _a.isSalary())) {
32
- this.get('transactions').disable();
33
- }
34
- // amount changes are not available for transactions with allocations or during allocate process
35
- if (allocations.length || transaction.operation === TransactionOperationEnum.ALLOCATE) {
36
- this.get('amount').disable();
37
- }
38
- // prefill tax value for preselected salary income source
39
- if (!this.get('tax').value && transaction.incomeSource && transaction.incomeSource.isSalaryIncome()) {
40
- this.updateTaxValue(transaction.incomeSource);
41
- }
42
- this.listenEvents();
43
- }
44
- listenEvents() {
45
- this.watchIncomeSource();
46
- this.watchChartAccounts();
47
- }
48
- watchIncomeSource() {
49
- this.get('incomeSource').valueChanges.subscribe((incomeSource) => {
50
- // prefill salary tax with its income source forecast
51
- if (incomeSource instanceof IncomeSource && incomeSource.isSalaryIncome() && !this.get('tax').value) {
52
- this.updateTaxValue(incomeSource);
53
- }
54
- });
55
- }
56
- updateTaxValue(incomeSource) {
57
- this.get('tax').setValue(incomeSource.salaryForecasts[0].taxWithheld);
58
- }
59
- watchChartAccounts() {
60
- super.watchChartAccounts();
61
- this.get('chartAccounts').valueChanges.subscribe((chartAccounts) => {
62
- this.buildMetadataForm();
63
- // tax make no sense for pre-paying tax category
64
- if (chartAccounts.isNRAS()) {
65
- this.get('tax').disable();
66
- }
67
- else {
68
- this.get('tax').enable();
69
- }
70
- // adjustments possible only for salary chartAccounts
71
- if (chartAccounts.isSalary()) {
72
- this.get('transactions').enable();
73
- }
74
- else {
75
- this.get('transactions').disable();
76
- }
77
- });
78
- }
79
- /**
80
- * depends on chartAccounts the form could include different extra fields
81
- */
82
- buildMetadataForm() {
83
- // Remove all controls in the FormArray before pushing
84
- this.get('metadata').clear();
85
- // create form controls for each metadata object from selected chart accounts
86
- (this.get('chartAccounts').value.metadata).forEach((chartAccountsMetadata) => {
87
- this.get('metadata').push(new FormGroup({
88
- value: new FormControl(chartAccountsMetadata.isSharePercentage() ? 100 : 0),
89
- chartAccountsMetadata: new FormControl(chartAccountsMetadata),
90
- }));
91
- });
92
- }
93
- /**
94
- * salary comes to bankAccount together with related transactions like tips (kind of salary, but reported in different tax summary section),
95
- * adjustments used to clarify received payment by separating it into multiple transactions,
96
- * netAmount always match received payment and includes related adjustments
97
- * amount calculated as netAmount - salary included adjustments
98
- * ie bankTransaction=1000$ with 900$ salary and 100$ tips will create 2 transactions with 900$ and 100$
99
- */
100
- getAmount() {
101
- return this.get('amount').value - new Collection(this.currentValue.transactions)
102
- .filter((t) => { var _a; return (_a = t.chartAccounts) === null || _a === void 0 ? void 0 : _a.isSalaryIncluded(); })
103
- .sumBy('amount');
104
- }
105
- submit(data = {}) {
106
- return super.submit(Object.assign(data, { amount: this.getAmount() }));
107
- }
108
- }
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1pbmNvbWUuZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9mb3Jtcy90cmFuc2FjdGlvbi93b3JrLWluY29tZS5mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQVFuRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0UsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVyRixNQUFNLE9BQU8sY0FBZSxTQUFRLGVBQWU7SUFDakQsWUFBWSxXQUF3QixFQUFFLGdCQUF5QixFQUFFLFdBQW9DOztRQUNuRyxnSEFBZ0g7UUFDaEgsV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBRTNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFO1lBQ2hELGdFQUFnRTtZQUNoRSxRQUFRLEVBQUUsSUFBSSxTQUFTLENBQ3JCLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBd0MsRUFBYSxFQUFFO2dCQUN2RixPQUFPLElBQUksU0FBUyxDQUFDO29CQUNuQixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO29CQUNqRCxxQkFBcUIsRUFBRSxJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FB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QUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQWUsRUFBRTtRQUN0QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHJhbnNhY3Rpb25Gb3JtfSBmcm9tICcuL3RyYW5zYWN0aW9uLmZvcm0nO1xuaW1wb3J0IHtcbiAgQ2hhcnRBY2NvdW50cyxcbiAgQ2hhcnRBY2NvdW50c01ldGFkYXRhLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25BbGxvY2F0aW9uLFxuICBUcmFuc2FjdGlvbk1ldGFkYXRhXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtJRXZlbnRMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ldmVudC1saXN0ZW5lci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtJbmNvbWVTb3VyY2V9IGZyb20gJy4uLy4uL21vZGVscy9pbmNvbWUtc291cmNlL2luY29tZS1zb3VyY2UnO1xuaW1wb3J0IHthdXRvY29tcGxldGVWYWxpZGF0b3J9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tICcuLi8uLi9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk9wZXJhdGlvbkVudW0gfSBmcm9tICcuLi8uLi9kYi9FbnVtcy90cmFuc2FjdGlvbi1vcGVyYXRpb24uZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrSW5jb21lRm9ybSBleHRlbmRzIFRyYW5zYWN0aW9uRm9ybSBpbXBsZW1lbnRzIElFdmVudExpc3RlbmVyIHtcbiAgY29uc3RydWN0b3IodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLCByZWdpc3RlcmVkRm9yR3N0OiBib29sZWFuLCBhbGxvY2F0aW9uczogVHJhbnNhY3Rpb25BbGxvY2F0aW9uW10pIHtcbiAgICAvLyBmb3Igd29yayBpbmNvbWUgd2UgbmVlZCB0byBzaG93IG5ldEFtb3VudCBpbnN0ZWFkIG9mIGFtb3VudCAoYmVjYXVzZSBzb21lIGFkanVzdG1lbnRzIGFyZSBpbmNsdWRlZCBpbiBhbW91bnQpXG4gICAgdHJhbnNhY3Rpb24uYW1vdW50ID0gdHJhbnNhY3Rpb24ubmV0QW1vdW50O1xuXG4gICAgc3VwZXIodHJhbnNhY3Rpb24sIHJlZ2lzdGVyZWRGb3JHc3QsIGFsbG9jYXRpb25zLCB7XG4gICAgICAvLyBhZGRpdGlvbmFsIGRhdGEgcmVsYXRlZCB0byB3b3JrIGluY29tZSAobGlrZSB0YXggaW5zdGFsbWVudHMpXG4gICAgICBtZXRhZGF0YTogbmV3IEZvcm1BcnJheShcbiAgICAgICAgKHRyYW5zYWN0aW9uLm1ldGFkYXRhIHx8IFtdKS5tYXAoKHRyYW5zYWN0aW9uTWV0YWRhdGE6IFRyYW5zYWN0aW9uTWV0YWRhdGEpOiBGb3JtR3JvdXAgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRm9ybUNvbnRyb2wodHJhbnNhY3Rpb25NZXRhZGF0YS52YWx1ZSksXG4gICAgICAgICAgICBjaGFydEFjY291bnRzTWV0YWRhdGE6IG5ldyBGb3JtQ29udHJvbCh0cmFuc2FjdGlvbk1ldGFkYXRhLmNoYXJ0QWNjb3VudHNNZXRhZGF0YSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICB0YXg6IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi50YXgsXG4gICAgICAgIGRpc2FibGVkOiAhdHJhbnNhY3Rpb24uY2hhcnRBY2NvdW50cyB8fCB0cmFuc2FjdGlvbi5jaGFydEFjY291bnRzLmlzTlJBUygpLFxuICAgICAgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBpbmNvbWVTb3VyY2U6IG5ldyBGb3JtQ29udHJvbCh0cmFuc2FjdGlvbi5pbmNvbWVTb3VyY2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBhdXRvY29tcGxldGVWYWxpZGF0b3IoKV0pLFxuICAgIH0pO1xuXG4gICAgLy8gZm9yYmlkIHRvIGVkaXQgc29tZSBmaWVsZHMgZm9yIGFsbG9jYXRlZCB0cmFuc2FjdGlvblxuICAgIGlmIChhbGxvY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2V0KCdjaGFydEFjY291bnRzJykuZGlzYWJsZSgpO1xuICAgIH1cbiAgICAvLyBhZGp1c3RtZW50cyBhbGxvd2VkIG9ubHkgZm9yIHNhbGFyeVxuICAgIGlmICghdHJhbnNhY3Rpb24uY2hhcnRBY2NvdW50cz8uaXNTYWxhcnkoKSkge1xuICAgICAgdGhpcy5nZXQoJ3RyYW5zYWN0aW9ucycpLmRpc2FibGUoKTtcbiAgICB9XG4gICAgLy8gYW1vdW50IGNoYW5nZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9ucyB3aXRoIGFsbG9jYXRpb25zIG9yIGR1cmluZyBhbGxvY2F0ZSBwcm9jZXNzXG4gICAgaWYgKGFsbG9jYXRpb25zLmxlbmd0aCB8fCB0cmFuc2FjdGlvbi5vcGVyYXRpb24gPT09IFRyYW5zYWN0aW9uT3BlcmF0aW9uRW51bS5BTExPQ0FURSkge1xuICAgICAgdGhpcy5nZXQoJ2Ftb3VudCcpLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBwcmVmaWxsIHRheCB2YWx1ZSBmb3IgcHJlc2VsZWN0ZWQgc2FsYXJ5IGluY29tZSBzb3VyY2VcbiAgICBpZiAoIXRoaXMuZ2V0KCd0YXgnKS52YWx1ZSAmJiB0cmFuc2FjdGlvbi5pbmNvbWVTb3VyY2UgJiYgdHJhbnNhY3Rpb24uaW5jb21lU291cmNlLmlzU2FsYXJ5SW5jb21lKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlVGF4VmFsdWUodHJhbnNhY3Rpb24uaW5jb21lU291cmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbkV2ZW50cygpO1xuICB9XG5cbiAgbGlzdGVuRXZlbnRzKCkge1xuICAgIHRoaXMud2F0Y2hJbmNvbWVTb3VyY2UoKTtcbiAgICB0aGlzLndhdGNoQ2hhcnRBY2NvdW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEluY29tZVNvdXJjZSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldCgnaW5jb21lU291cmNlJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoaW5jb21lU291cmNlOiBzdHJpbmcgfCBJbmNvbWVTb3VyY2UpOiB2b2lkID0+IHtcbiAgICAgIC8vIHByZWZpbGwgc2FsYXJ5IHRheCB3aXRoIGl0cyBpbmNvbWUgc291cmNlIGZvcmVjYXN0XG4gICAgICBpZiAoaW5jb21lU291cmNlIGluc3RhbmNlb2YgSW5jb21lU291cmNlICYmIGluY29tZVNvdXJjZS5pc1NhbGFyeUluY29tZSgpICYmICF0aGlzLmdldCgndGF4JykudmFsdWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUYXhWYWx1ZShpbmNvbWVTb3VyY2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYXhWYWx1ZShpbmNvbWVTb3VyY2U6IEluY29tZVNvdXJjZSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0KCd0YXgnKS5zZXRWYWx1ZShpbmNvbWVTb3VyY2Uuc2FsYXJ5Rm9yZWNhc3RzWzBdLnRheFdpdGhoZWxkKTtcbiAgfVxuXG4gIHdhdGNoQ2hhcnRBY2NvdW50cygpOiB2b2lkIHtcbiAgICBzdXBlci53YXRjaENoYXJ0QWNjb3VudHMoKTtcbiAgICB0aGlzLmdldCgnY2hhcnRBY2NvdW50cycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGNoYXJ0QWNjb3VudHM6IENoYXJ0QWNjb3VudHMpID0+IHtcbiAgICAgIHRoaXMuYnVpbGRNZXRhZGF0YUZvcm0oKTtcblxuICAgICAgLy8gdGF4IG1ha2Ugbm8gc2Vuc2UgZm9yIHByZS1wYXlpbmcgdGF4IGNhdGVnb3J5XG4gICAgICBpZiAoY2hhcnRBY2NvdW50cy5pc05SQVMoKSkge1xuICAgICAgICB0aGlzLmdldCgndGF4JykuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXQoJ3RheCcpLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGp1c3RtZW50cyBwb3NzaWJsZSBvbmx5IGZvciBzYWxhcnkgY2hhcnRBY2NvdW50c1xuICAgICAgaWYgKGNoYXJ0QWNjb3VudHMuaXNTYWxhcnkoKSkge1xuICAgICAgICB0aGlzLmdldCgndHJhbnNhY3Rpb25zJykuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldCgndHJhbnNhY3Rpb25zJykuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlcGVuZHMgb24gY2hhcnRBY2NvdW50cyB0aGUgZm9ybSBjb3VsZCBpbmNsdWRlIGRpZmZlcmVudCBleHRyYSBmaWVsZHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhZGF0YUZvcm0oKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGFsbCBjb250cm9scyBpbiB0aGUgRm9ybUFycmF5IGJlZm9yZSBwdXNoaW5nXG4gICAgKHRoaXMuZ2V0KCdtZXRhZGF0YScpIGFzIEZvcm1BcnJheSkuY2xlYXIoKTtcblxuICAgIC8vIGNyZWF0ZSBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIG1ldGFkYXRhIG9iamVjdCBmcm9tIHNlbGVjdGVkIGNoYXJ0IGFjY291bnRzXG4gICAgKHRoaXMuZ2V0KCdjaGFydEFjY291bnRzJykudmFsdWUubWV0YWRhdGEpLmZvckVhY2goKGNoYXJ0QWNjb3VudHNNZXRhZGF0YTogQ2hhcnRBY2NvdW50c01ldGFkYXRhKTogdm9pZCA9PiB7XG4gICAgICAodGhpcy5nZXQoJ21ldGFkYXRhJykgYXMgRm9ybUFycmF5KS5wdXNoKFxuICAgICAgICBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICB2YWx1ZTogbmV3IEZvcm1Db250cm9sKGNoYXJ0QWNjb3VudHNNZXRhZGF0YS5pc1NoYXJlUGVyY2VudGFnZSgpID8gMTAwIDogMCksXG4gICAgICAgICAgY2hhcnRBY2NvdW50c01ldGFkYXRhOiBuZXcgRm9ybUNvbnRyb2woY2hhcnRBY2NvdW50c01ldGFkYXRhKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2FsYXJ5IGNvbWVzIHRvIGJhbmtBY2NvdW50IHRvZ2V0aGVyIHdpdGggcmVsYXRlZCB0cmFuc2FjdGlvbnMgbGlrZSB0aXBzIChraW5kIG9mIHNhbGFyeSwgYnV0IHJlcG9ydGVkIGluIGRpZmZlcmVudCB0YXggc3VtbWFyeSBzZWN0aW9uKSxcbiAgICogYWRqdXN0bWVudHMgdXNlZCB0byBjbGFyaWZ5IHJlY2VpdmVkIHBheW1lbnQgYnkgc2VwYXJhdGluZyBpdCBpbnRvIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogbmV0QW1vdW50IGFsd2F5cyBtYXRjaCByZWNlaXZlZCBwYXltZW50IGFuZCBpbmNsdWRlcyByZWxhdGVkIGFkanVzdG1lbnRzXG4gICAqIGFtb3VudCBjYWxjdWxhdGVkIGFzIG5ldEFtb3VudCAtIHNhbGFyeSBpbmNsdWRlZCBhZGp1c3RtZW50c1xuICAgKiBpZSBiYW5rVHJhbnNhY3Rpb249MTAwMCQgd2l0aCA5MDAkIHNhbGFyeSBhbmQgMTAwJCB0aXBzIHdpbGwgY3JlYXRlIDIgdHJhbnNhY3Rpb25zIHdpdGggOTAwJCBhbmQgMTAwJFxuICAgKi9cbiAgZ2V0QW1vdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhbW91bnQnKS52YWx1ZSAtIG5ldyBDb2xsZWN0aW9uKHRoaXMuY3VycmVudFZhbHVlLnRyYW5zYWN0aW9ucylcbiAgICAgIC5maWx0ZXIoKHQpID0+IHQuY2hhcnRBY2NvdW50cz8uaXNTYWxhcnlJbmNsdWRlZCgpKVxuICAgICAgLnN1bUJ5KCdhbW91bnQnKTtcbiAgfVxuXG4gIHN1Ym1pdChkYXRhOiBvYmplY3QgPSB7fSk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gc3VwZXIuc3VibWl0KE9iamVjdC5hc3NpZ24oZGF0YSwge2Ftb3VudDogdGhpcy5nZXRBbW91bnQoKX0pKTtcbiAgfVxufVxuIl19